@refraction-ui/react 0.19.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-533MCMSU.js +2355 -0
- package/dist/chunk-533MCMSU.js.map +7 -0
- package/dist/chunk-AMK4VCBG.js +250 -0
- package/dist/chunk-AMK4VCBG.js.map +7 -0
- package/dist/chunk-BOLFYVI6.js +90 -0
- package/dist/chunk-BOLFYVI6.js.map +7 -0
- package/dist/chunk-F7B64KT3.js +187 -0
- package/dist/chunk-F7B64KT3.js.map +7 -0
- package/dist/chunk-FD37DFCC.js +77 -0
- package/dist/chunk-FD37DFCC.js.map +7 -0
- package/dist/chunk-H54FLNAF.js +132 -0
- package/dist/chunk-H54FLNAF.js.map +7 -0
- package/dist/chunk-INP46354.js +664 -0
- package/dist/chunk-INP46354.js.map +7 -0
- package/dist/chunk-ONACRMG4.js +116 -0
- package/dist/chunk-ONACRMG4.js.map +7 -0
- package/dist/chunk-SDZ3LROZ.js +7 -0
- package/dist/chunk-SDZ3LROZ.js.map +7 -0
- package/dist/chunk-TOZBR4GL.js +154 -0
- package/dist/chunk-TOZBR4GL.js.map +7 -0
- package/dist/chunk-UNEM2TRI.js +225 -0
- package/dist/chunk-UNEM2TRI.js.map +7 -0
- package/dist/chunk-VK3EQ34F.js +92 -0
- package/dist/chunk-VK3EQ34F.js.map +7 -0
- package/dist/chunk-WK2IIUFO.js +316 -0
- package/dist/chunk-WK2IIUFO.js.map +7 -0
- package/dist/chunk-WSPJTQAV.js +59 -0
- package/dist/chunk-WSPJTQAV.js.map +7 -0
- package/dist/chunk-XWP763SH.js +3 -2
- package/dist/chunk-XWP763SH.js.map +7 -1
- package/dist/chunk-Y2FNNAIL.js +80 -0
- package/dist/chunk-Y2FNNAIL.js.map +1 -0
- package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
- package/dist/chunk-ZF3OHCGV.js.map +7 -0
- package/dist/form.cjs +5 -11
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +6 -12
- package/dist/form.js.map +1 -1
- package/dist/index.cjs +2879 -33936
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +126 -28780
- package/dist/internal/react-app-shell/index.d.cts +2 -22
- package/dist/internal/react-app-shell/index.d.ts +2 -22
- package/dist/internal/react-badge/index.d.cts +5 -0
- package/dist/internal/react-badge/index.d.ts +5 -0
- package/dist/internal/react-callout/index.d.cts +4 -0
- package/dist/internal/react-callout/index.d.ts +4 -0
- package/dist/internal/react-card/index.d.cts +8 -1
- package/dist/internal/react-card/index.d.ts +8 -1
- package/dist/internal/react-collapsible/index.d.cts +0 -3
- package/dist/internal/react-collapsible/index.d.ts +0 -3
- package/dist/internal/react-combobox/index.d.cts +0 -3
- package/dist/internal/react-combobox/index.d.ts +0 -3
- package/dist/internal/react-command/index.d.cts +0 -3
- package/dist/internal/react-command/index.d.ts +0 -3
- package/dist/internal/react-data-table/index.d.cts +0 -3
- package/dist/internal/react-data-table/index.d.ts +0 -3
- package/dist/internal/react-dialog/index.d.cts +0 -3
- package/dist/internal/react-dialog/index.d.ts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
- package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
- package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
- package/dist/internal/react-form/index.d.cts +2 -21
- package/dist/internal/react-form/index.d.ts +2 -21
- package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
- package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
- package/dist/internal/react-link-card/index.d.cts +8 -2
- package/dist/internal/react-link-card/index.d.ts +8 -2
- package/dist/internal/react-popover/index.d.cts +0 -3
- package/dist/internal/react-popover/index.d.ts +0 -3
- package/dist/internal/react-sheet/index.d.cts +0 -3
- package/dist/internal/react-sheet/index.d.ts +0 -3
- package/dist/internal/react-slot/index.d.cts +23 -0
- package/dist/internal/react-slot/index.d.ts +23 -0
- package/dist/internal/react-toast/index.d.cts +0 -3
- package/dist/internal/react-toast/index.d.ts +0 -3
- package/dist/internal/react-tooltip/index.d.cts +0 -3
- package/dist/internal/react-tooltip/index.d.ts +0 -3
- package/dist/react-accordion.js +125 -0
- package/dist/react-accordion.js.map +7 -0
- package/dist/react-ai.js +257 -0
- package/dist/react-ai.js.map +7 -0
- package/dist/react-analytics.js +1698 -0
- package/dist/react-analytics.js.map +7 -0
- package/dist/react-animated-text.js +164 -0
- package/dist/react-animated-text.js.map +7 -0
- package/dist/react-app-shell.js +631 -0
- package/dist/react-app-shell.js.map +7 -0
- package/dist/react-audience-feature-card.js +53 -0
- package/dist/react-audience-feature-card.js.map +7 -0
- package/dist/react-audio-room.js +166 -0
- package/dist/react-audio-room.js.map +7 -0
- package/dist/react-auth.js +211 -0
- package/dist/react-auth.js.map +7 -0
- package/dist/react-avatar-group.js +154 -0
- package/dist/react-avatar-group.js.map +7 -0
- package/dist/react-avatar.js +168 -0
- package/dist/react-avatar.js.map +7 -0
- package/dist/react-badge.js +86 -0
- package/dist/react-badge.js.map +7 -0
- package/dist/react-bottom-nav.js +67 -0
- package/dist/react-bottom-nav.js.map +7 -0
- package/dist/react-brand-network-cell.js +92 -0
- package/dist/react-brand-network-cell.js.map +7 -0
- package/dist/react-breadcrumbs.js +104 -0
- package/dist/react-breadcrumbs.js.map +7 -0
- package/dist/react-browser-chrome-mock.js +89 -0
- package/dist/react-browser-chrome-mock.js.map +7 -0
- package/dist/react-button.js +13 -0
- package/dist/react-button.js.map +7 -0
- package/dist/react-calendar.js +301 -0
- package/dist/react-calendar.js.map +7 -0
- package/dist/react-call-controls.js +113 -0
- package/dist/react-call-controls.js.map +7 -0
- package/dist/react-callout.js +152 -0
- package/dist/react-callout.js.map +7 -0
- package/dist/react-card-grid.js +34 -0
- package/dist/react-card-grid.js.map +7 -0
- package/dist/react-card.js +200 -0
- package/dist/react-card.js.map +7 -0
- package/dist/react-carousel.js +132 -0
- package/dist/react-carousel.js.map +7 -0
- package/dist/react-charts.js +509 -0
- package/dist/react-charts.js.map +7 -0
- package/dist/react-checkbox.js +156 -0
- package/dist/react-checkbox.js.map +7 -0
- package/dist/react-checklist.js +168 -0
- package/dist/react-checklist.js.map +7 -0
- package/dist/react-code-block.js +78 -0
- package/dist/react-code-block.js.map +7 -0
- package/dist/react-code-editor.js +184 -0
- package/dist/react-code-editor.js.map +7 -0
- package/dist/react-collapsible.js +192 -0
- package/dist/react-collapsible.js.map +7 -0
- package/dist/react-combobox.js +609 -0
- package/dist/react-combobox.js.map +7 -0
- package/dist/react-command-input.js +202 -0
- package/dist/react-command-input.js.map +7 -0
- package/dist/react-command.js +364 -0
- package/dist/react-command.js.map +7 -0
- package/dist/react-composer.js +2036 -0
- package/dist/react-composer.js.map +7 -0
- package/dist/react-content-protection.js +133 -0
- package/dist/react-content-protection.js.map +7 -0
- package/dist/react-conversation.js +1226 -0
- package/dist/react-conversation.js.map +7 -0
- package/dist/react-cookie-consent.js +291 -0
- package/dist/react-cookie-consent.js.map +7 -0
- package/dist/react-data-table.js +310 -0
- package/dist/react-data-table.js.map +7 -0
- package/dist/react-date-picker.js +95 -0
- package/dist/react-date-picker.js.map +7 -0
- package/dist/react-device-frame.js +137 -0
- package/dist/react-device-frame.js.map +7 -0
- package/dist/react-dialog.js +218 -0
- package/dist/react-dialog.js.map +7 -0
- package/dist/react-diff-viewer.js +460 -0
- package/dist/react-diff-viewer.js.map +7 -0
- package/dist/react-dropdown-menu.js +292 -0
- package/dist/react-dropdown-menu.js.map +7 -0
- package/dist/react-editor-status-bar.js +148 -0
- package/dist/react-editor-status-bar.js.map +7 -0
- package/dist/react-editor-tabs.js +159 -0
- package/dist/react-editor-tabs.js.map +7 -0
- package/dist/react-emoji-picker.js +238 -0
- package/dist/react-emoji-picker.js.map +7 -0
- package/dist/react-empty-state.js +90 -0
- package/dist/react-empty-state.js.map +7 -0
- package/dist/react-feedback-dialog.js +275 -0
- package/dist/react-feedback-dialog.js.map +7 -0
- package/dist/react-file-tree.js +376 -0
- package/dist/react-file-tree.js.map +7 -0
- package/dist/react-file-upload.js +360 -0
- package/dist/react-file-upload.js.map +7 -0
- package/dist/react-floating-reactions.js +124 -0
- package/dist/react-floating-reactions.js.map +7 -0
- package/dist/react-flow-editor.js +198 -0
- package/dist/react-flow-editor.js.map +7 -0
- package/dist/react-footer.js +67 -0
- package/dist/react-footer.js.map +7 -0
- package/dist/react-graph-view.js +197 -0
- package/dist/react-graph-view.js.map +7 -0
- package/dist/react-icon-system.js +9 -0
- package/dist/react-icon-system.js.map +7 -0
- package/dist/react-infinite-canvas.js +8 -0
- package/dist/react-infinite-canvas.js.map +7 -0
- package/dist/react-inline-editor.js +216 -0
- package/dist/react-inline-editor.js.map +7 -0
- package/dist/react-input-group.js +150 -0
- package/dist/react-input-group.js.map +7 -0
- package/dist/react-input.js +10 -0
- package/dist/react-input.js.map +7 -0
- package/dist/react-install-prompt.js +132 -0
- package/dist/react-install-prompt.js.map +7 -0
- package/dist/react-kanban-board.js +198 -0
- package/dist/react-kanban-board.js.map +7 -0
- package/dist/react-keyboard-shortcut.js +36 -0
- package/dist/react-keyboard-shortcut.js.map +7 -0
- package/dist/react-language-selector.js +311 -0
- package/dist/react-language-selector.js.map +7 -0
- package/dist/react-link-card.js +48 -0
- package/dist/react-link-card.js.map +7 -0
- package/dist/react-live-captions.js +92 -0
- package/dist/react-live-captions.js.map +7 -0
- package/dist/react-live-cursors.js +145 -0
- package/dist/react-live-cursors.js.map +7 -0
- package/dist/react-live-transcript.js +117 -0
- package/dist/react-live-transcript.js.map +7 -0
- package/dist/react-location-selector.js +252 -0
- package/dist/react-location-selector.js.map +7 -0
- package/dist/react-logger.js +415 -0
- package/dist/react-logger.js.map +7 -0
- package/dist/react-markdown-renderer.js +12 -0
- package/dist/react-markdown-renderer.js.map +7 -0
- package/dist/react-marquee-strip.js +62 -0
- package/dist/react-marquee-strip.js.map +7 -0
- package/dist/react-mascot.js +367 -0
- package/dist/react-mascot.js.map +7 -0
- package/dist/react-mastery-bar.js +97 -0
- package/dist/react-mastery-bar.js.map +7 -0
- package/dist/react-mini-map.js +207 -0
- package/dist/react-mini-map.js.map +7 -0
- package/dist/react-mobile-nav.js +216 -0
- package/dist/react-mobile-nav.js.map +7 -0
- package/dist/react-navbar.js +96 -0
- package/dist/react-navbar.js.map +7 -0
- package/dist/react-numbered-steps.js +67 -0
- package/dist/react-numbered-steps.js.map +7 -0
- package/dist/react-otp-input.js +318 -0
- package/dist/react-otp-input.js.map +7 -0
- package/dist/react-pagination.js +199 -0
- package/dist/react-pagination.js.map +7 -0
- package/dist/react-password-input.js +104 -0
- package/dist/react-password-input.js.map +7 -0
- package/dist/react-payment.js +81 -0
- package/dist/react-payment.js.map +7 -0
- package/dist/react-popover.js +176 -0
- package/dist/react-popover.js.map +7 -0
- package/dist/react-pre-call-lobby.js +309 -0
- package/dist/react-pre-call-lobby.js.map +7 -0
- package/dist/react-presence-indicator.js +86 -0
- package/dist/react-presence-indicator.js.map +7 -0
- package/dist/react-pricing-card.js +142 -0
- package/dist/react-pricing-card.js.map +7 -0
- package/dist/react-progress-display.js +188 -0
- package/dist/react-progress-display.js.map +7 -0
- package/dist/react-radial-gauge.js +193 -0
- package/dist/react-radial-gauge.js.map +7 -0
- package/dist/react-radio.js +169 -0
- package/dist/react-radio.js.map +7 -0
- package/dist/react-rating-scale.js +171 -0
- package/dist/react-rating-scale.js.map +7 -0
- package/dist/react-reaction-bar.js +111 -0
- package/dist/react-reaction-bar.js.map +7 -0
- package/dist/react-resizable-layout.js +298 -0
- package/dist/react-resizable-layout.js.map +7 -0
- package/dist/react-rich-editor.js +1 -0
- package/dist/react-rich-editor.js.map +7 -0
- package/dist/react-search-bar.js +285 -0
- package/dist/react-search-bar.js.map +7 -0
- package/dist/react-section-head.js +65 -0
- package/dist/react-section-head.js.map +7 -0
- package/dist/react-segmented-control.js +215 -0
- package/dist/react-segmented-control.js.map +7 -0
- package/dist/react-select.js +389 -0
- package/dist/react-select.js.map +7 -0
- package/dist/react-separator.js +86 -0
- package/dist/react-separator.js.map +7 -0
- package/dist/react-sheet.js +310 -0
- package/dist/react-sheet.js.map +7 -0
- package/dist/react-sidebar.js +100 -0
- package/dist/react-sidebar.js.map +7 -0
- package/dist/react-skeleton.js +91 -0
- package/dist/react-skeleton.js.map +7 -0
- package/dist/react-skip-to-content.js +38 -0
- package/dist/react-skip-to-content.js.map +7 -0
- package/dist/react-slide-viewer.js +264 -0
- package/dist/react-slide-viewer.js.map +7 -0
- package/dist/react-slider.js +105 -0
- package/dist/react-slider.js.map +7 -0
- package/dist/react-slot-picker.js +184 -0
- package/dist/react-slot-picker.js.map +7 -0
- package/dist/react-slot.js +7 -0
- package/dist/react-slot.js.map +7 -0
- package/dist/react-social-auth-button.js +169 -0
- package/dist/react-social-auth-button.js.map +7 -0
- package/dist/react-sortable-list.js +204 -0
- package/dist/react-sortable-list.js.map +7 -0
- package/dist/react-stat-grid.js +69 -0
- package/dist/react-stat-grid.js.map +7 -0
- package/dist/react-status-indicator.js +117 -0
- package/dist/react-status-indicator.js.map +7 -0
- package/dist/react-steps.js +167 -0
- package/dist/react-steps.js.map +7 -0
- package/dist/react-sticky-note.js +131 -0
- package/dist/react-sticky-note.js.map +7 -0
- package/dist/react-switch.js +139 -0
- package/dist/react-switch.js.map +7 -0
- package/dist/react-table-of-contents.js +80 -0
- package/dist/react-table-of-contents.js.map +7 -0
- package/dist/react-tabs.js +230 -0
- package/dist/react-tabs.js.map +7 -0
- package/dist/react-terminal.js +101 -0
- package/dist/react-terminal.js.map +7 -0
- package/dist/react-test-results.js +158 -0
- package/dist/react-test-results.js.map +7 -0
- package/dist/react-textarea.js +89 -0
- package/dist/react-textarea.js.map +7 -0
- package/dist/react-thread-view.js +139 -0
- package/dist/react-thread-view.js.map +7 -0
- package/dist/react-timeline.js +153 -0
- package/dist/react-timeline.js.map +7 -0
- package/dist/react-toast.js +253 -0
- package/dist/react-toast.js.map +7 -0
- package/dist/react-tooltip.js +221 -0
- package/dist/react-tooltip.js.map +7 -0
- package/dist/react-version-selector.js +270 -0
- package/dist/react-version-selector.js.map +7 -0
- package/dist/react-video-grid.js +129 -0
- package/dist/react-video-grid.js.map +7 -0
- package/dist/react-video-player.js +206 -0
- package/dist/react-video-player.js.map +7 -0
- package/dist/react-video-tile.js +8 -0
- package/dist/react-video-tile.js.map +7 -0
- package/dist/react-voice-pill.js +314 -0
- package/dist/react-voice-pill.js.map +7 -0
- package/dist/react-waveform.js +558 -0
- package/dist/react-waveform.js.map +7 -0
- package/dist/react-wizard.js +337 -0
- package/dist/react-wizard.js.map +7 -0
- package/dist/styles.css +7 -0
- package/dist/theme.js +1 -1
- package/package.json +3 -2
- package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
- package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
- package/dist/chunk-4A4BW3GR.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-X3HTTRQK.js +0 -6438
- package/dist/module-X3HTTRQK.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/globals.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/utils/globals.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/config.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/featureFlagUtils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/gzip.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/types.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/bot-detection.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/string-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/type-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/number-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/bucketed-rate-limiter.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/user-agent-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/utils/index.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/logs/logs-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/logs/index.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/metrics/metrics-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/metrics/index.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/chunk-ids.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/error-properties-builder.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/parsers/base.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/parsers/safari.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/parsers/chrome.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/parsers/gecko.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/parsers/index.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/dom-exception-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/error-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/error-event-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/string-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/types.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/object-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/event-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/primitive-coercer.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/coercers/promise-rejection-event.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/error-tracking/exception-steps.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/logger.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/entrypoints/external-scripts-loader.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/config.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/constants.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/general-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/cookie-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/uuidv7.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/storage.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/consent.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/url-targeting-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/constants.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/element-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/autocapture-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/dead-clicks-autocapture.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/segment-integration.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/sentry-integration.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/page-view.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/persistence-key-transforms.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/persistence-key-policy.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/request-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/event-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-persistence.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-surveys-types.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-product-tours-types.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/rate-limiter.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/remote-config.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/types.ts","../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fflate/0.4.8/3d6bb6f51514b78f73eff8bf58c4fef7e18a9483e0eef595f39f3a49c6c31e1d/node_modules/fflate/esm/browser.js","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/request.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/encode-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/request-queue.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/retry-queue.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/scroll-manager.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/session-props.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/simple-event-emitter.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/sessionid.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/blocked-uas.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/device-model-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/regex-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/property-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/utils/request-router.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/surveys/activation.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/utils/survey-utils.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/surveys/keys.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/external-integration.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-core.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/surveys/events.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/rageclick.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/autocapture.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/exception-autocapture/index.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/replay/rrweb-plugins/patch.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/tracing-headers.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/web-vitals/index.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/replay/external/triggerMatching.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/replay/external/recording-strategies.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/replay/external/lazy-loaded-session-recorder.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/replay/session-recording.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/heatmaps.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-product-tours.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/site-apps.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/browser-common/dist/utils/elements-chain-utils.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/surveys/action-matcher.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/utils/event-receiver.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/utils/survey-event-receiver.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-surveys.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/toolbar.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-featureflags.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-exceptions.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/web-experiments.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/conversations/posthog-conversations.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-logs.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/extension-bundles.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/extensions/history-autocapture.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/logs-defaults.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/posthog-metrics.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/core/dist/metrics/config.mjs","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/entrypoints/default-extensions.ts","../../../node_modules/.pnpm/posthog-js@1.407.2/node_modules/posthog-js/src/entrypoints/module.no-external.es.ts"],"names":["win","window","global","globalThis","globals_navigator","navigator","globals_document","document","globals_location","location","fetch","XMLHttpRequest","AbortController","CompressionStream","userAgent","isBrowserOnline","onLine","globalObject","commonWindow","self","File","assignableWindow","packageVersion","config","DEBUG","LIB_VERSION","LIB_NAME","JS_SDK_VERSION","parsePayload","response","JSON","parse","_unused","getEnabledFromValue","value","getVariantFromValue","crc32Table","MINIMAL_FLAG_CALLED_EVENT_PROPERTIES","types_PostHogPersistedProperty","PostHogPersistedProperty","types_Compression","Compression","knownUnsafeEditableEvent","knownUnsafeEditableEventProperty","NATIVE_GZIP_VALIDATION_ERROR","hasGzipMagic","bytes","length","isGzipRequest","compression","urlCompression","GZipJS","isNativeAsyncGzipReadError","error","String","name","throwNativeGzipValidationError","reason","Error","validateNativeGzip","_ref","_asyncToGenerator","compressed","inputBytes","size","header","Uint8Array","slice","arrayBuffer","trailer","DataView","getUint32","table","getCrc32Table","i","crc","j","inputSize","_x","_x2","apply","this","arguments","_gzipCompress","input","isDebug","options","TextEncoder","encode","compressedStream","writer","writable","getWriter","writePromise","write","then","close","catch","_ref2","err","abort","_x6","responsePromise","Response","readable","blob","Promise","all","rethrow","console","DEFAULT_BLOCKED_UA_STRS","isBlockedUA","ua","customBlockedUserAgents","uaLower","toLowerCase","concat","some","blockedUA","blockedUaLower","indexOf","includes","str","needle","trim","stripLeadingDollar","s","replace","safeJsonStringify","_JSON$stringify","ancestors","stringify","_key","replacementValue","toString","message","stack","pop","push","ObjProto","Object","prototype","type_utils_hasOwnProperty","hasOwnProperty","type_utils_toString","isArray","Array","obj","call","isFunction","x","isObject","isEmptyObject","key","isUndefined","isString","isEmptyString","isNull","isNullish","isNumber","isPositiveNumber","isBoolean","isFormData","FormData","isKnownUnsafeEditableEvent","isKnownUnsafeEditableEventProperty","isPrimitive","isBuiltin","candidate","className","isEvent","Event","base","yesLikeValues","isYesLike","val","noLikeValues","clampToRange","min","max","logger","fallbackValue","warn","BucketedRateLimiter","constructor","_buckets","_onBucketRateLimited","_bucketSize","bucketSize","_logger","_refillRate","refillRate","_refillInterval","refillInterval","_applyRefill","bucket","now","refillIntervals","Math","floor","lastAccess","tokens","consumeRateLimit","_this$_onBucketRateLi","Date","keyStr","stop","MOBILE","IOS","ANDROID","TABLET","ANDROID_TABLET","IPAD","APPLE","APPLE_WATCH","SAFARI","BLACKBERRY","SAMSUNG","SAMSUNG_BROWSER","SAMSUNG_INTERNET","CHROME","CHROME_OS","CHROME_IOS","INTERNET_EXPLORER","INTERNET_EXPLORER_MOBILE","OPERA","OPERA_MINI","EDGE","MICROSOFT_EDGE","FIREFOX","FIREFOX_IOS","NINTENDO","PLAYSTATION","XBOX","ANDROID_MOBILE","MOBILE_SAFARI","WINDOWS","WINDOWS_PHONE","NOKIA","OUYA","GENERIC","GENERIC_MOBILE","GENERIC_TABLET","KONQUEROR","OCULUS_BROWSER","VIVALDI","YANDEX","WHALE","DUCKDUCKGO","PALE_MOON","WATERFOX","BRAVE","GOOGLE_SEARCH_APP","BROWSER_VERSION_REGEX_SUFFIX","DEFAULT_BROWSER_VERSION_REGEX","RegExp","XBOX_REGEX","PLAYSTATION_REGEX","NINTENDO_REGEX","BLACKBERRY_REGEX","windowsVersionMap","detectBrowser","user_agent","vendor","hints","fromHints","brave","detectGoogleSearchApp","test","FACEBOOK","safariCheck","versionRegexes","Mozilla","detectBrowserVersion","browser","regexes","matches","match","parseFloat","osMatchers","_","exec","osVersion","join","version","result","detectDevice","UUID_REGEX","getEventUuid","uuid","generateUuid","stripUrlHash","url","split","safeSetTimeout","fn","timeout","t","setTimeout","unref","isError","OTLP_SEVERITY_MAP","trace","text","number","debug","info","fatal","DEFAULT_OTLP_SEVERITY","toOtlpAnyValue","boolValue","Number","isFinite","isInteger","intValue","doubleValue","stringValue","arrayValue","values","map","v","toOtlpKeyValueList","attrs","buildOtlpLogRecord","sdkContext","level","severityText","severityNumber","autoAttributes","distinctId","posthogDistinctId","sessionId","windowId","sessionStartTimestamp","lastActivityTimestamp","currentUrl","screenName","appState","activeFeatureFlags","feature_flags","mergedAttributes","_extends","attributes","record","timeUnixNano","observedTimeUnixNano","body","trace_id","traceId","span_id","spanId","trace_flags","flags","buildResourceAttributes","sdkName","sdkVersion","resourceAttributes","serviceName","environment","serviceVersion","buildOtlpLogsPayload","logRecords","scopeName","scopeVersion","resourceLogs","resource","scopeLogs","scope","PostHogLogs$1","_instance","_config","_getContext","_onReady","_waitForStoragePersist","_scopeName","_config$maxQueueSize","resolve","_flushPromise","_evictedSinceAdvance","_consecutiveFlushFailures","_intervalWindowStart","_intervalLogCount","_droppedWarned","_maxBufferSize","maxBufferSize","_maxQueueSize","maxQueueSize","_flushIntervalMs","flushIntervalMs","_maxBatchRecordsPerPost","maxBatchRecordsPerPost","_rateCapWindowMs","rateCapWindowMs","_maxLogsPerInterval","maxLogsPerInterval","reset","_clearFlushTimer","onReconnect","_flushInBackground","captureLog","isDisabled","optedOut","filtered","_runBeforeSend","_checkRateLimit","entry","_enqueue","beforeSend","fns","next","e","elapsed","flush","_this","_flushInner","finally","_this2","_this2$_instance$getP","queue","getPersistedProperty","LogsQueue","originalQueueLength","sentCount","_this2$_scopeName","_this2$_instance$getP2","batchSize","batch","payload","_buildResourceAttributes","getLibraryId","getLibraryVersion","outcome","_sendLogsBatch","kind","_persistQueueAdvance","consumed","_this3","_this3$_instance$getP","drop","refreshed","setPersistedProperty","_this$_instance$getPe","shift","_armFlushTimer","delayMs","_flushTimer","_nextFlushDelay","exponent","pow","_hasQueuedRecords","shutdown","timeoutMs","_this4","flushPromise","race","flushWithTimeout","_this5","timedOut","timerPromise","clearTimeout","DEFAULT_HISTOGRAM_BOUNDS","msToUnixNano","ms","seriesKey","type","unit","attrsKey","keys","sort","k","PostHogMetrics$1","_series","Map","_seriesCapWarned","_typeByName","_typeCollisionWarned","Set","_generation","count","_capture","gauge","histogram","prev","run","_doFlush","p","drainWindow","_buildPayload","sample","state","get","_admitNewSeries","windowStartMs","set","seenType","has","add","_fold","maxSeriesPerFlush","_state$total","total","last","hist","sum","bucketCounts","fill","bounds","generation","_sendMetricsBatch","_mergeWindowBack","metrics","_buildMetrics","resourceMetrics","scopeMetrics","nowNano","byMetric","_state$attributes","metricKey","metric","aggregationTemporality","isMonotonic","dataPoints","startNano","_state$total2","dp","startTimeUnixNano","asDouble","_state$last","explicitBounds","from","_current$total","_old$total","_ref3","old","current","parsedStackResults","lastKeysCount","cachedFilenameChunkIds","getFilenameToChunkIdMap","stackParser","chunkIdMap","_posthogChunkIds","chunkIdKeys","reduce","acc","stackKey","parsedStack","stackFrame","filename","chunkId","ErrorPropertiesBuilder","coercers","modifiers","buildFromUnknown","hint","mechanism","handled","exceptionWithCause","buildCoercingContext","parsingContext","buildParsingContext","exceptionWithStack","parseStacktrace","$exception_list","convertToExceptionList","$exception_level","modifyFrames","exceptionList","exc","stacktrace","frames","applyModifiers","coerceFallback","ctx","_ctx$syntheticExcepti","syntheticException","synthetic","cause","applyChunkIds","skipFirstLines","frame","chunk_id","applyCoercers","adapter","coerce","newFrames","modifier","_mechanism$type","_mechanism$handled","_exceptionWithStack$s","currentException","_hint$skipFirstLines","depth","UNKNOWN_FUNCTION","createFrame","platform","func","lineno","colno","function","in_app","extractSafariExtensionDetails","isSafariExtension","isSafariWebExtension","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","chromeStackLineParser","line","noFnParts","parts","subMatch","_extractSafariExtensi","geckoREgex","geckoEvalRegex","geckoStackLineParser","WEBPACK_ERROR_REGEXP","DOMExceptionCoercer","isDOMException","isDOMError","hasStack","getType","getValue","ErrorCoercer","getMessage","getStack","_ctx","ErrorEventCoercer","ERROR_TYPES_PATTERN","StringCoercer","_this$getInfos","getInfos","groups","severityLevels","extractExceptionKeysForMessage","maxLength","serialized","ObjectCoercer","errorProperty","getErrorPropertyFromObject","isSeverityLevel","getObjectClassName","prop","getPrototypeOf","EventCoercer","evt","constructorName","PrimitiveCoercer","PromiseRejectionEventCoercer","isCustomEventWrappingRejection","detail","getUnhandledRejectionReason","_unused2","EXCEPTION_STEP_INTERNAL_FIELDS","RESERVED_EXCEPTION_STEP_KEYS","DEFAULT_EXCEPTION_STEPS_CONFIG","enabled","max_bytes","resolveExceptionStepsConfig","_config$enabled","normalizePositiveInteger","ExceptionStepsBuffer","_entries","_totalBytes","setConfig","_trimToMaxBytes","step","json","parsed","parsedStep","timestamp","encoded","encodeURIComponent","byteLength","getAttachable","clear","evicted","fallback","normalized","_createLogger","prefix","_temp","debugEnabled","_log","external_globals_mjs_window","POSTHOG_DEBUG","consoleLog","_len","args","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","critical","_len6","_key6","uninitializedWarning","methodName","createLogger","additionalPrefix","logger_logger","loadScript","posthog","callback","disable_external_dependency_loading","existingScripts","querySelectorAll","_ret","_loop","src","alreadyExistingScriptTag","__posthog_loading_callback_fired","addEventListener","event","onerror","addScript","scriptTag","createElement","crossOrigin","onload","prepare_external_dependency_script","external_scripts_inject_target","head","appendChild","_scripts$0$parentNode","scripts","parentNode","insertBefore","__PosthogExtensions__","loadExternalDependency","strict_script_versioning","requestRouter","endpointFor","scriptUrlToLoad","fiveMinutesInMillis","token","loadSiteApp","scriptUrl","Config","packageInfo","PEOPLE_DISTINCT_ID_KEY","DEVICE_ID","DEVICE_MODEL","ALIAS_ID_KEY","EVENT_TIMERS_KEY","AUTOCAPTURE_DISABLED_SERVER_SIDE","HEATMAPS_ENABLED_SERVER_SIDE","EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE","ERROR_TRACKING_SUPPRESSION_RULES","ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS","WEB_VITALS_ENABLED_SERVER_SIDE","DEAD_CLICKS_ENABLED_SERVER_SIDE","PRODUCT_TOURS_ENABLED_SERVER_SIDE","WEB_VITALS_ALLOWED_METRICS","SESSION_RECORDING_REMOTE_CONFIG","SESSION_RECORDING_SAMPLE_RATE","SESSION_RECORDING_OVERRIDE_SAMPLING","SESSION_RECORDING_OVERRIDE_LINKED_FLAG","SESSION_RECORDING_OVERRIDE_URL_TRIGGER","SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER","SESSION_ID","SESSION_RECORDING_IS_SAMPLED","ENABLED_FEATURE_FLAGS","PERSISTENCE_ACTIVE_FEATURE_FLAGS","PERSISTENCE_EARLY_ACCESS_FEATURES","PERSISTENCE_FEATURE_FLAG_DETAILS","PERSISTENCE_FEATURE_FLAG_PAYLOADS","PERSISTENCE_FEATURE_FLAG_REQUEST_ID","PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS","PERSISTENCE_OVERRIDE_FEATURE_FLAGS","PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS","STORED_PERSON_PROPERTIES_KEY","STORED_GROUP_PROPERTIES_KEY","SURVEYS","SURVEYS_LOADED_AT","SURVEYS_ACTIVATED","SURVEYS_ACTIVATED_SESSION","PRODUCT_TOURS","FLAG_CALL_REPORTED","FLAG_CALL_REPORTED_SESSION_ID","PERSISTENCE_FEATURE_FLAG_ERRORS","PERSISTENCE_FEATURE_FLAG_EVALUATED_AT","USER_STATE","CLIENT_SESSION_PROPS","CAPTURE_RATE_LIMIT","INITIAL_CAMPAIGN_PARAMS","INITIAL_REFERRER_INFO","INITIAL_PERSON_INFO","ENABLE_PERSON_PROCESSING","COOKIELESS_SENTINEL_VALUE","COOKIELESS_MODE_FLAG_PROPERTY","SDK_DEBUG_EXTENSIONS_INIT_METHOD","SDK_DEBUG_EXTENSIONS_INIT_TIME_MS","SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED","LOAD_EXT_NOT_FOUND","COOKIELESS_ON_REJECT","COOKIELESS_ALWAYS","USER_STATE_ANONYMOUS","USER_STATE_IDENTIFIED","PERSON_PROFILES_IDENTIFIED_ONLY","DOM_EVENT_VISIBILITYCHANGE","DOM_EVENT_BEFOREUNLOAD","EVENT_PAGEVIEW","EVENT_PAGELEAVE","EVENT_IDENTIFY","EVENT_GROUPIDENTIFY","eachArray","iterator","forEach","each","core_hasOwnProperty","extend","source","entries","ownProps","resArray","trySafe","safewrap","f","stripEmptyProperties","ret","EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE","isCrossDomainCookie","documentLocation","hostname","lastTwoParts","excluded","element","_ref$capture","capture","_ref$passive","passive","isToolbarInstance","getCookieValue","external_globals_mjs_document","nameEQ","cookies","cookie","filter","charAt","substring","decodeURIComponent","trunc","ceil","UUID","TypeError","unixTsMs","randA","randBHi","randBLo","RangeError","clone","equals","other","compareTo","diff","sign","V7Generator","generate","generateOrAbort","_timestamp","valueAfterReset","ts","_resetCounter","_counter","fromFieldsV7","_random","nextUint32","DefaultRandom","defaultGenerator","getRandomValues","buffer","UUIDV7_DENY_WEAK_RNG","random","crypto","_buffer","_cursor","Uint32Array","uuidv7","uuidv7obj","firstNonPublicSubDomain","DOMAIN_MATCH_REGEX","cookieStore","_is_supported","_error","msg","_get","_parse","_set","days","cross_subdomain","is_secure","expires","secure","cdomain","matchedSubDomain","cookieJar","list","len","candidateCookieValue","originalMatch","date","setTime","getTime","toUTCString","new_cookie_val","_remove","_unused3","_localStorage_supported","localStore","supported","_unused4","localStorage","getItem","_unused5","setItem","removeItem","COOKIE_PERSISTED_PROPERTIES","memoryStorage","memoryStore","sessionStorageSupported","sessionStore","_unused8","sessionStorage","_unused9","ConsentManager","consent","_getDnt","_storedConsent","isOptedOut","cookieless_mode","isRejected","isOptedIn","isExplicitlyOptedOut","opt_out_capturing_by_default","optInOut","_storage","_storageKey","cookie_expiration","cross_subdomain_cookie","secure_cookie","_this$_instance$confi","opt_out_capturing_cookie_prefix","consent_persistence_name","persistenceType","opt_out_capturing_persistence_type","expectedStore","_persistentStore","otherStorage","respect_dnt","doNotTrack","dntValue","applyUrlTargetingOverride","instance","defaultUrl","_instance$config","override","get_current_url","TOOLBAR_ID","NODE_TYPE_ELEMENT","NODE_TYPE_TEXT","NODE_TYPE_DOCUMENT_FRAGMENT","isElementInToolbar","el","Element","id","closest","isElementNode","nodeType","isTag","tag","tagName","isTextNode","isShadowRoot","host","MAX_DOM_ANCESTOR_DEPTH","splitClassString","checkForURLMatches","urlsList","_external_globals_mjs","href","regex","getClassNames","baseVal","getAttribute","makeSafeText","shouldCaptureValue","getSafeText","elText","shouldCaptureElement","isSensitiveElement","childNodes","child","_makeSafeText","textContent","getEventTarget","_e$target","target","srcElement","shadowRoot","composedPath","autocaptureCompatibleElements","checkIfElementsMatchCSSSelector","elements","selectorList","_ret2","_loop2","selector","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","getParentElement","curEl","DEFAULT_AUTOCAPTURE_IGNORE_LIST","DEFAULT_CONTENT_IGNORELIST","DEFAULT_CONTENT_IGNORELIST_WITH_STEPPERS","matchesContentKeyword","keyword","DEFAULT_RAGE_CLICK_IGNORE_LIST","TEXT_SELECTION_INPUT_TYPES","shouldCaptureRageclick","cannotCheckForAutocapture","selectorIgnoreList","contentIgnorelist","ignoreTextSelection","_config$css_selector_2","_config$ignore_text_s","css_selector_ignorelist","content_ignorelist","ignore_text_selection","isContentEditable","contentEditable","targetElementList","getElementAndParentsForElement","elementsWithText","keywords","safeText","ariaLabel","_element$getAttribute","captureOnAnyElement","parentIsUsefulElement","compStyles","getComputedStyle","getPropertyValue","seen","classes","coreCCPattern","anchoredCCRegex","unanchoredCCRegex","coreSSNPattern","anchoredSSNRegex","unanchoredSSNRegex","anchorRegexes","getDirectAndNestedSpanText","getNestedSpanText","_child$tagName","spanText","escapeQuotes","extractAttrClass","attr_class","isDeadClicksEnabledForHeatmaps","isDeadClicksEnabledForAutocapture","_instance$instance$pe","isRemoteEnabled","persistence","get_property","clientConfig","capture_dead_clicks","DeadClicksAutocapture","lazyLoadedDeadClicksAutocapture","_lazyLoadedDeadClicksAutocapture","isEnabled","onCapture","startIfEnabledOrStop","onRemoteConfig","ok","register","captureDeadClicks","_loadScript","_start","cb","_assignableWindow$__P","_assignableWindow$__P2","initDeadClicksAutocapture","_assignableWindow$__P3","__onCapture","capture_dead_swipes","start","NAME","createEventProcessor","_posthog","organization","projectId","_ref$severityAllowLis","severityAllowList","_ref$sendExceptionsTo","sendExceptionsToPostHog","_event$exception","_exceptions$","_exceptions$2","_exceptions$3","_exceptions$4","__loaded","tags","personUrl","get_distinct_id","sessionRecordingStarted","get_session_replay_url","withTimestamp","_posthog$exceptions","exceptions","exception","undefined","data","$exception_message","$exception_type","$sentry_event_id","event_id","$sentry_exception","$sentry_exception_message","$sentry_exception_type","$sentry_tags","sendExceptionEvent","SentryIntegration","setupOnce","addGlobalEventProcessor","PageViewManager","_onSessionIdChange","_windowId","changeReason","noSessionId","activityTimeout","sessionPastMaximumLength","crossTabAdoption","_currentPageview","scrollManager","resetContext","_setupSessionRotationHandler","_this$_instance$sessi","_unsubscribeSessionId","sessionManager","onSessionId","destroy","_this$_unsubscribeSes","doPageView","pageViewId","_window$location$path","_previousPageViewProperties","pathname","doPageLeave","_this$_currentPagevie","doEvent","_this$_currentPagevie2","$pageview_id","pageviewId","previousPageView","properties","$prev_pageview_id","scrollContext","getContext","disable_scroll_properties","maxScrollHeight","lastScrollY","maxScrollY","maxContentHeight","lastContentY","maxContentY","lastScrollPercentage","maxScrollPercentage","lastContentPercentage","maxContentPercentage","$prev_pageview_last_scroll","$prev_pageview_last_scroll_percentage","$prev_pageview_max_scroll","$prev_pageview_max_scroll_percentage","$prev_pageview_last_content","$prev_pageview_last_content_percentage","$prev_pageview_max_content","$prev_pageview_max_content_percentage","$prev_pageview_pathname","$prev_pageview_duration","PERSISTENCE_STORAGE_GROUPS","PERSISTENCE_KEY_POLICY","exposure","__cmpns","$session_recording_enabled_server_side","shouldSkipFromEventProperties","$session_past_minimum_duration","$session_recording_url_trigger_activated_session","$session_recording_event_trigger_activated_session","$debug_first_full_snapshot_timestamp","$sess_rec_flush_size","storageGroup","shouldSkip","transformToEventProperties","eventProperties","volatile","$product_tours_activated","$product_tours_activated_session","$conversations_widget_session_id","$conversations_ticket_id","$conversations_widget_state","$conversations_user_traits","$sdk_debug_replay_event_trigger_status","$sdk_debug_replay_linked_flag_trigger_status","$sdk_debug_replay_matched_recording_trigger_groups","$sdk_debug_replay_remote_trigger_matching_config","$sdk_debug_replay_trigger_groups_count","$sdk_debug_replay_url_trigger_status","$session_recording_start_reason","PERSISTENCE_KEY_PREFIX_POLICY","getPersistenceKeyPolicy","exactMatch","policy","jsonStringify","space","convertToURL","getQueryParam","param","keyValuePair","queryParts","maskQueryParams","maskedParams","mask","splitHash","hash","splitQuery","queryString","urlWithoutQueryAndHash","paramStrings","_getHashParam","isStatusZeroFailureCircuitBreakerTripped","consecutiveStatusZeroFailures","maxConsecutiveStatusZeroFailures","updateStatusZeroFailureCount","statusCode","onCircuitBreakerTripped","updatedConsecutiveStatusZeroFailures","URL_REGEX_PREFIX","PERSONAL_DATA_CAMPAIGN_PARAMS","CAMPAIGN_PARAMS","MASKED","COOKIE_CAMPAIGN_PARAMS","getCampaignParams","customTrackedParams","maskPersonalDataProperties","customPersonalDataProperties","params","paramsToMask","urlCampaignParams","_getCampaignParamsFromUrl","URL","cookieCampaignParams","kwkey","kw","customParams","campaign_keywords","_getSearchInfoFromReferrer","referrer","search","getBrowserLanguage","language","userLanguage","DIRECT","getReferrer","getPersonInfo","disableCaptureUrlHashes","external_globals_mjs_location","r","u","getPersonPropsFromInfo","_convertToURL2","props","$referrer","$referring_domain","campaignParams","searchInfo","getTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","getTimezoneOffset","GROUP_FRESHNESS_KEY","surveys","CASE_INSENSITIVE_PERSISTENCE_TYPES","MAIN_STORAGE_SLOT","PostHogPersistence","ownsSplitStorage","_slotState","_splitStorageEligible","_splitStorage","_ownsSplitStorage","_campaign_params_saved","_name","_buildStorage","_resolveSplitStorage","load","update_config","save","_saveDebounceMs","_this$_config","persistence_save_debounce_ms","_disabled","store","localPlusCookieStore","customCookieProperties","preferCookieOnConflict","cookiePropertiesToPersist","cookieProperties","_unused6","localStorageData","safeCookieProperties","_unused7","stored","cookiePersistedProperties","splitEligible","storage_type","_groupEntryName","group","_isFeatureFlagCacheStale","ttl","effectiveTtl","feature_flag_cache_ttl_ms","evaluatedAt","_loadGroupEntries","groupEntry","_slotWriteState","persisted","_mainCarriesGroupKey","fingerprint","_entryFingerprint","_groupEntryIsStale","_getPersistenceKeyPol","freshnessKey","groupLoadedAt","mainLoadedAt","refreshKey","_getPersistenceKeyPol2","_setProp","mainEntry","_deleteProp","debounce","_pendingSaveTimer","_writeNow","_writeNowSplit","_writeEntry","_this$_partitionProps","_partitionProps","main","_this$_slotState$grou","groupProps","_getPersistenceKeyPol3","slot","_expire_days","_cross_subdomain","_secure","stable","_getPersistenceKeyPol4","storage","dirty","remove","_ref$keepGroupEntries","keepGroupEntries","register_once","default_value","_default_expiry","hasChanges","unregister","update_campaign_params","custom_campaign_params","mask_personal_data_properties","custom_personal_data_properties","update_search_keyword","update_referrer_info","_convertToURL","set_initial_person_info","disable_capture_url_hashes","get_initial_props","initialReferrerInfo","initialPersonInfo","initialPersonProps","personProps","safe_merge","oldConfig","set_disabled","set_cross_subdomain","set_secure","persistenceChanged","isArrayContentsEqual","arr1","arr2","sortedArr1","sortedArr2","every","item","index","cookie_persisted_properties","newStore","wantSplit","disabled","set_event_timer","event_name","timers","remove_event_timer","set_property","to","_getPersistenceKeyPol5","_markGroupDirty","_getPersistenceKeyPol6","SurveyEventType","Activation","Cancellation","SurveyWidgetType","Button","Tab","Selector","SurveyPosition","TopLeft","TopRight","TopCenter","MiddleLeft","MiddleRight","MiddleCenter","Left","Center","Right","NextToTrigger","SurveyTabPosition","Top","Bottom","SurveyType","Popover","API","Widget","ExternalSurvey","SurveyQuestionType","Open","MultipleChoice","SingleChoice","Rating","Link","SurveyQuestionBranchingType","NextQuestion","End","ResponseBased","SpecificQuestion","SurveySchedule","Once","Recurring","Always","SurveyEventName","SHOWN","DISMISSED","SENT","ABANDONED","SurveyEventProperties","SURVEY_ID","SURVEY_NAME","SURVEY_RESPONSE","SURVEY_ITERATION","SURVEY_ITERATION_START_DATE","SURVEY_PARTIALLY_COMPLETED","SURVEY_SUBMISSION_ID","SURVEY_QUESTIONS","SURVEY_COMPLETED","PRODUCT_TOUR_ID","SURVEY_LAST_SEEN_DATE","SURVEY_LANGUAGE","DisplaySurveyType","Inline","DEFAULT_PRODUCT_TOUR_APPEARANCE","backgroundColor","textColor","buttonColor","borderRadius","buttonBorderRadius","borderColor","fontFamily","boxShadow","showOverlay","whiteLabel","dismissOnClickOutside","zIndex","ProductTourEventName","COMPLETED","STEP_SHOWN","STEP_COMPLETED","BUTTON_CLICKED","STEP_SELECTOR_FAILED","BANNER_CONTAINER_SELECTOR_FAILED","BANNER_ACTION_CLICKED","ProductTourEventProperties","TOUR_ID","TOUR_NAME","TOUR_ITERATION","TOUR_RENDER_REASON","TOUR_STEP_ID","TOUR_STEP_ORDER","TOUR_STEP_TYPE","TOUR_DISMISS_REASON","TOUR_BUTTON_TEXT","TOUR_BUTTON_ACTION","TOUR_BUTTON_LINK","TOUR_BUTTON_TOUR_ID","TOUR_STEPS_COUNT","TOUR_STEP_SELECTOR","TOUR_STEP_SELECTOR_FOUND","TOUR_STEP_ELEMENT_TAG","TOUR_STEP_ELEMENT_ID","TOUR_STEP_ELEMENT_CLASSES","TOUR_STEP_ELEMENT_TEXT","TOUR_ERROR","TOUR_MATCHES_COUNT","TOUR_FAILURE_PHASE","TOUR_WAITED_FOR_ELEMENT","TOUR_WAIT_DURATION_MS","TOUR_BANNER_SELECTOR","TOUR_LINKED_SURVEY_ID","USE_MANUAL_SELECTOR","INFERENCE_DATA_PRESENT","TOUR_LAST_SEEN_DATE","TOUR_TYPE","RateLimiter","serverLimits","lastEventRateLimited","checkForLimiting","httpResponse","quota_limited","batchKey","clientRateLimitContext","isRateLimited","captureEventsPerSecond","_this$instance$config","rate_limiting","events_per_second","captureEventsBurstLimit","_this$instance$config2","events_burst_limit","checkOnly","_this$instance$persis","_this$instance$persis2","_this$instance$persis3","$$client_ingestion_warning_message","skip_client_rate_limiting","remainingTokens","isServerRateLimited","retryAfter","RemoteConfigLoader","remoteConfig","_assignableWindow$_PO","_POSTHOG_REMOTE_CONFIG","_loadRemoteConfigJs","_loadRemoteConfigJSON","_send_request","method","_onRemoteConfig","_startRefreshInterval","_shouldDisableFlags","_refreshInterval","clearInterval","refresh","visibilityState","reloadFeatureFlags","intervalMs","remote_config_refresh_interval_ms","setInterval","_this$_instance$featu","hasFeatureFlags","advanced_disable_feature_flags_on_first_load","featureFlags","ensureFlagsLoaded","Base64","u8","u16","Uint16Array","u32","fleb","fdeb","clim","freb","eb","b","_a","revfl","revfd","rev","hMap","cd","mb","l","co","le","flt","fdt","flm","fdm","shft","slc","n","subarray","wbits","d","o","wbits16","hTree","t2","a","i0","i1","i2","maxSym","tr","mbt","ln","dt","lft","cst","i2_1","i2_2","i2_3","lc","c","cl","cli","cln","cls","w","clen","cf","wfblk","out","pos","dat","wblk","final","syms","lf","df","li","bs","bl","dlt","mlb","_b","ddt","mdb","_c","lclt","nlc","_d","lcdt","ndc","lcfreq","_e","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","it","clct","dst","deo","crct","wbytes","gzipSync","opts","cr","opt","pre","post","lvl","plvl","lst","msk_1","bs1_1","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","maxd","ml","nl","mmd","md","ti","lin","din","mem","log","mtime","charCodeAt","SUPPORTS_REQUEST","CONTENT_TYPE_PLAIN","nativeAsyncGzipDisabled","removeURLParam","_url$split","_urlWithoutHash$split","baseUrl","updatedSearch","pair","extendURLParams","_search$split$map","_url$split2","newParams","_newParams$key","_pair$split","remaining","formdata","arg_separator","use_val","use_key","tph_arr","encodePostData","_encodedBody","gzipData","latin1","ar","ai","contentType","byteOffset","estimatedSize","b64data","btoa","p1","fromCharCode","parseInt","encodedBody","Blob","jsonBody","encodePostDataSafely","fallbackToUncompressed","transport","ArrayBuffer","isView","encodeRequest","preEncodeAsync","jsonData","_x3","_x4","_x5","NETWORK_ERROR_MESSAGES","_fetch","encodedRequest","headers","Headers","headerValue","headerName","append","aborter","controller","signal","handleError","_aborter","keepalive","_keepaliveDisabled","SIXTY_FOUR_KILOBYTES","fetchOptions","responseText","res","status","_sendBeacon","_encodePostDataSafely","_ref4","sendBeaconBody","sendBeacon","mid","VERSIONLESS_ENDPOINTS","buildRequestURL","timestampMode","versionlessEndpoint","path","parsedURL","endpoint","hasEndpointSuffix","requestURL","timestampParam","ver","AVAILABLE_TRANSPORTS","req","open","setRequestHeader","onreadystatechange","readyState","send","DEFAULT_FLUSH_INTERVAL_MS","RequestQueue","sendRequest","_isPaused","_queue","_flushTimeoutMs","flush_interval_ms","_sendRequest","enqueue","_flushTimeout","_setFlushTimeout","unload","_clearFlushTimeout","requests","_formatQueue","requestValues","_sendRequestSafely","enable","abs","request","_requests$key$data","RetryQueue","_isPolling","_pollIntervalMs","_areWeOnline","_onlineListener","_flush","_offlineListener","retriableRequest","retriesPerformedSoFar","_objectWithoutPropertiesLoose","_excluded","retry_count","requestOptions","msToNextRetry","rawBackoffTime","minBackoff","cappedBackoffTime","jitterFraction","retryAt","logMessage","_poll","_poller","notToFlush","toFlush","_ref5","removeEventListener","ScrollManager","_updateScrollData","_this$_context$maxScr","_this$_context$maxScr2","_this$_context$maxCon","_this$_context$maxCon2","_context","scrollElement","scrollY","scrollHeight","clientHeight","contentY","contentHeight","_scrollRoot","scroll_root_selector","startMeasuringScrollPosition","documentElement","selectors","querySelector","_scrollPosition","axis","elementKey","pageYOffset","scrollTop","scrollX","pageXOffset","scrollLeft","generateSessionSourceParams","SessionPropsManager","sessionIdManager","sessionSourceParamGenerator","_onSessionIdCallback","_getStored","newProps","_sessionSourceParamGenerator","_persistence","_sessionIdManager","getSetOnceProps","_this$_getStored","referringDomain","$pathname","initialPathName","utm_source","utm_campaign","utm_medium","utm_content","utm_term","getSessionProps","SimpleEventEmitter","on","listener","_events","emit","SessionIdManager","handler","_eventEmitter","sessionIdGenerator","windowIdGenerator","_this$_config$bootstr","_lastPersistedActivityTimestamp","_sessionIdChangedHandlers","_beforeUnloadListener","_destroyed","_sessionHasBeenIdleTooLong","sessionTimeoutMs","_sessionId","_sessionStartTimestamp","_sessionActivityTimestamp","_sessionIdGenerator","_windowIdGenerator","persistenceName","_sessionTimeoutMs","$configured_session_timeout_ms","_resetIdleTimer","_window_id_storage_key","_primary_window_exists_storage_key","_canUseSessionStorage","lastWindowId","primaryWindowExists","bootstrap","sessionID","hex","uuid7ToTimestampMs","_setSessionId","_listenToReloadWindow","h","_setWindowId","_getWindowId","_isActivityChangeBelowGranularity","newActivityTimestamp","lastPersisted","sessionActivityTimestamp","activityChanged","isActivityOnlyChange","_useCrossTabRefreshHardening","_refreshSessionIdFromStorage","_flushPendingActivityTimestamp","_this$_sessionId","_this$_getSessionId","_getSessionId","_freshestActivityTimestamp","persistedActivity","inMemory","_isSessionIdleAfterCrossTabRefresh","sessionIdInfo","resetSessionId","_enforceIdleTimeout","checkAndGetSessionAndWindowId","readOnly","_this$_getSessionId3","startTimestamp","valuesChanged","preRefreshSessionId","_this$_getSessionId4","idleSessionId","isLikelyBot","uaData","userAgentData","brands","brandObj","brand","webdriver","_getDeviceModel","external_globals_mjs_navigator","getHighEntropyValues","model","isMatchingRegex","pattern","getPersonPropertiesHash","distinct_id","userPropertiesToSet","userPropertiesToSetOnce","propertyComparisons","exact","targets","is_not","not_regex","icontains","not_icontains","gt","numValue","isNaN","lt","matchPropertyFilters","propertyFilters","eventPropertyValue","eventValues","comparisonFunction","operator","RequestRouterRegion","ingestionDomain","staticAssetPath","RequestRouter","_regionCache","apiHost","api_host","flagsApiHost","customHost","flags_api_host","uiHost","ui_host","region","_staticAssetHostOverride","asset_host","assetHostOverride","suffix","doesSurveyActivateByEvent","survey","_survey$conditions","conditions","events","SURVEY_LOGGER","SURVEY_SEEN_PREFIX","setSurveySeenOnLocalStorage","surveySeenKey","getSurveyStorageKey","current_iteration","IN_APP_SURVEY_TYPES","DEFAULT_DISPLAY_SURVEY_OPTIONS","ignoreConditions","ignoreDelay","displayType","MAPPED_INTEGRATIONS","intercom","crispChat","ExternalIntegrations","_assignableWindow$__P4","_assignableWindow$__P5","integrations","instances","_executeArrayDepth","__NOOP","CONSENT_COOKIELESS_WARN","SURVEYS_NOT_AVAILABLE","SANITIZE_DEPRECATED","DENYLIST_INVALID","FLAG_CALLED_TRANSPORT_PROPERTY_KEYS","PRIMARY_INSTANCE_NAME","ENQUEUE_REQUESTS","defaultConfig","defaults","_window$location","autocapture","persistence_name","loaded","save_campaign_params","custom_blocked_useragents","save_referrer","capture_pageleave","__preview_deferred_init_extensions","__preview_external_dependency_versioned_paths","__preview_cookie_wins_on_conflict","upgrade","disable_session_recording","disable_persistence","disable_web_experiments","disable_surveys","disable_surveys_automatic_display","disable_conversations","disable_product_tours","disableDeviceModel","enable_recording_console_log","protocol","ip","opt_out_persistence_by_default","opt_out_useragent_filter","opt_in_site_apps","property_denylist","sanitize_properties","request_headers","request_batching","properties_string_max_length","mask_all_element_attributes","mask_all_text","advanced_disable_flags","advanced_disable_decide","advanced_disable_feature_flags","advanced_only_evaluate_survey_feature_flags","advanced_feature_flags_dedup_per_session","advanced_enable_surveys","advanced_disable_toolbar_metrics","feature_flag_request_timeout_ms","surveys_request_timeout_ms","on_request_error","get_device_id","capture_performance","disable_compression","session_idle_timeout_seconds","person_profiles","before_send","request_queue_config","error_tracking","_onCapture","rageclick","capture_pageview","session_recording","strictMinimumDuration","canvasCapture","resolutionScale","streamNetworkBody","internal_or_test_user_hostname","split_storage","detect_google_search_app","CONFIG_RENAMES","configRenames","origConfig","renames","oldKey","newKey","newConfig","previewExternalDependencyVersionedPaths","property_blacklist","DeprecatedWebPerformanceObserver","__forceAllowLocalhost","_forceAllowLocalhost","PostHog","_replaceExtension","oldExt","newExt","idx","_extensions","splice","initialize","_inCookielessMode","decideEndpointWasHit","_this$featureFlags$ha","_this$featureFlags","hasLoadedFlags","flagsEndpointWasHit","_this$featureFlags$ha2","_this$featureFlags2","_PostHog$__defaultExt","webPerformance","_personProcessingSetOncePropertiesSent","_internalEventEmitter","_calculate_event_properties","calculateEventProperties","bind","sentryIntegration","processor","processEvent","__request_queue","analyticsDefaultEndpoint","_initialPageviewCaptured","_visibilityStateListener","_initialPersonProfilesConfig","_cachedPersonProperties","pageViewManager","rateLimiter","externalIntegrations","ext","__defaultExtensionClasses","toolbar","conversations","logs","experiments","people","setProps","setPersonProperties","set_once","init","_instances$name","namedPosthog","_init","_config$bootstrap","_config$bootstrap2","normalizedToken","_checkLocalStorageForDebug","_originalUserConfig","_triggered_notifs","process_person","baseConfig","userConfig","mergedConfig","set_config","on_xhr_error","persistenceDisabled","_is_persistence_disabled","sessionPersistence","initialPersistenceProps","initialSessionProps","$initialization_time","toISOString","_requestQueue","_send_retriable_request","_retryQueue","startInCookielessMode","sessionPropsManager","_initExtensions","thisC","identity_distinct_id","distinctID","isIdentifiedID","bootstrapDistinctId","existingDistinctId","existingUserState","identify","deviceID","$device_id","_handle_unload","segment","done","bootstrapUser","user","getSegmentAnonymousId","anonymousId","segmentUser","enrichEvent","eventName","userId","additionalProperties","assign","isLoaded","track","page","screen","_loaded","getDeviceModel","_this$featureFlags3","_this$exceptions","_this$surveys","_this$logs","_this$metrics","_this$conversations","_this$toolbar","_this$experiments","initStartTime","performance","__extensionClasses","initTasks","historyAutocapture","tracingHeaders","siteApps","sessionRecording","productTours","heatmaps","webVitalsAutocapture","exceptionObserver","deadClicksAutocapture","extension","_pendingRemoteConfig","_processInitTaskQueue","task","taskInitTiming","round","register_for_session","_lastRemoteConfig","_config$analytics","supportedCompression","analytics","_start_queue_if_opted_in","setInternalOrTestUser","_captureInitialPageview","_remoteConfigLoader","_this$_requestQueue","is_capturing","_dom_loaded","_this$surveys2","_this$metrics2","_this$logs2","_this$_requestQueue2","_this$_retryQueue","handlePageUnload","_shouldCapturePageleave","flushLogs","fireCallbackOnDrop","api_transport","disable_beacon","__preview_disable_beacon","disableTransport","fetch_options","_options","_options$transport","_find$method","_find","sent_at","availableTransports","transportMethod","predicate","encodedOptions","_this$config$on_reque","_this$config","_execute_array","array","fn_name","alias_calls","other_calls","capturing_calls","execute","calls","thisArg","caller","_options$_url","maxStringLength","customizer","COPY_IN_PROGRESS_SET","isBot","_is_bot","__preview_capture_bot_pageviews","$current_url","_originatedFromCaptureException","systemTime","$browser_type","shouldSendMinimalFlagCalledEvent","$set","unsetProperties","$unset","action","surveyProperty","setOnceProperties","_calculate_set_once_properties","$set_once","_noTruncate","internalDeepCircularCopy","copy","transportKeys","minimal","copyKey","surveyId","surveyIteration","tourType","finalSet","setPersonPropertiesForFlags","beforeSendResult","_url","_batchKey","send_instantly","_addCaptureHook","persistenceProps","pageviewProperties","infoProperties","_navigator","_navigator2","_external_globals_mjs2","nav","_detectOS","_osMatchers$i","resultOrFn","os_name","os_version","browserHints","browserOptions","deviceOptions","userAgentDataPlatform","maxTouchPoints","screenWidth","width","screenHeight","height","devicePixelRatio","lang","_options$maxTouchPoin","_options$screenWidth","_options$screenHeight","_options$devicePixelR","device","$os","$os_version","$browser","$device","$device_type","$timezone","$timezone_offset","$host","$raw_user_agent","$browser_version","$browser_language","$browser_language_prefix","$screen_height","$screen_width","$viewport_height","innerHeight","$viewport_width","innerWidth","$lib","$lib_version","$insert_id","$time","SDK_DIST_CHANNEL","_this$sessionManager$","_this$_retryQueue2","sdkDebugProperties","title","duration_in_ms","toFixed","persistenceProperties","sessionPersistenceProperties","referrerKey","_isIdentified","denylisted_prop","hasPersonProcessing","_hasPersonProcessing","_requirePersonProcessing","dataSetOnce","markAsSent","forceIncludeInitialProps","_this$sessionPropsMan","initialProps","sessionProps","_this$persistence","_this$persistence2","_this$sessionPersiste","property","_this$persistence3","unregister_for_session","_this$sessionPersiste2","_register_single","getFeatureFlag","_this$featureFlags4","getFeatureFlagPayload","_this$featureFlags5","getFeatureFlagResult","_this$featureFlags6","getAllFeatureFlags","_this$featureFlags$ge","_this$featureFlags7","isFeatureEnabled","_this$featureFlags$is","_this$featureFlags8","defaultValue","_this$featureFlags9","updateFlags","payloads","_this$featureFlags0","updateEarlyAccessFeatureEnrollment","isEnrolled","stage","_this$featureFlags1","getEarlyAccessFeatures","force_reload","stages","_this$featureFlags10","onFeatureFlags","errorsLoading","onSurveysLoaded","_this$sessionManager$2","_this$sessionManager","getSurveys","forceReload","getActiveMatchingSurveys","renderSurvey","_this$surveys3","displaySurvey","_this$surveys4","cancelPendingSurvey","_this$surveys5","canRenderSurvey","_this$surveys$canRend","_this$surveys6","visible","disabledReason","canRenderSurveyAsync","_this$surveys$canRend2","_this$surveys7","_validateIdentifyId","new_distinct_id","previous_distinct_id","$user_id","$had_persisted_distinct_id","_this$featureFlags11","isKnownAnonymous","$anon_distinct_id","setAnonymousDistinctId","unsetPersonProperties","propertyNames","_this$featureFlags12","names","unsetPersonPropertiesForFlags","groupType","groupKey","groupPropertiesToSet","existingGroups","getGroups","isNewGroup","resetGroupPropertiesForFlags","$groups","groupIdentifyProperties","$group_type","$group_key","$group_set","setGroupPropertiesForFlags","resetGroups","_this$featureFlags13","resetPersonPropertiesForFlags","_this$featureFlags14","_this$featureFlags15","group_type","_this$featureFlags16","reset_device_id","_this$persistence4","_this$sessionPersiste3","_this$surveys8","_this$_remoteConfigLo","_this$featureFlags17","_this$conversations2","_this$logs3","_this$metrics3","_this$persistence6","_this$sessionManager2","_this$persistence5","device_id","device_model","recordingRemoteConfig","$last_posthog_reset","identity_hash","_shutdownTimeoutMs","_this$logs4","_this$metrics4","_this$_requestQueue3","_this$_retryQueue3","_this$featureFlags18","setIdentity","_this$conversations3","alias","_onIdentityChanged","clearIdentity","_this$conversations4","_onIdentityCleared","get_session_id","_this$sessionManager$3","_this$sessionManager3","_this$sessionManager$4","_options$timestampLoo","LOOK_BACK","timestampLookBack","original","_this$persistence7","_this$exceptionObserv","_this$exceptions2","_this$sessionRecordin","_this$tracingHeaders","_this$autocapture","_this$heatmaps","_this$exceptionObserv2","_this$deadClicksAutoc","_this$surveys9","_this$externalIntegra","isPersistenceDisabled","debugConfigFromLocalStorage","onConfigChange","startIfEnabled","loadIfEnabled","_sync_opt_out_with_persistence","_overrideSDKInfo","startSessionRecording","_this$sessionManager4","_this$sessionRecordin2","_this$sessionRecordin3","_this$sessionRecordin4","_this$sessionRecordin5","overrideAll","overrideConfig","sampling","linked_flag","url_trigger","event_trigger","Boolean","overrideSampling","overrideLinkedFlag","overrideTrigger","stopSessionRecording","_this$sessionRecordin6","started","captureException","errorToProperties","buildProperties","addExceptionStep","_this$exceptions3","_this$logs5","_this$logs$logger","_this$logs6","_noopLogger","startExceptionAutocapture","capture_exceptions","stopExceptionAutocapture","loadToolbar","_this$toolbar$loadToo","_this$toolbar2","property_name","_this$persistence8","getSessionProperty","_this$sessionPersiste4","_this$config$name","_this$persistence9","_this$sessionPersiste5","_this$persistence0","_this$persistence1","createPersonProfile","$internal_or_test_user","function_name","_this$persistence10","_this$sessionPersiste6","_this$persistence11","_this$sessionPersiste7","opt_in_capturing","_this$sessionRecordin8","_this$sessionManager5","_this$pageViewManager","_this$config$__extens","_this$config$__extens2","_PostHog$__defaultExt2","_this$sessionRecordin7","SessionRecordingClass","_this$surveys0","_options$captureEvent","captureEventName","captureProperties","opt_out_capturing","_this$sessionRecordin9","_this$sessionManager6","_this$pageViewManager2","stopRecording","has_opted_in_capturing","has_opted_out_capturing","get_explicit_consent_status","clear_opt_in_out_capturing","originalConfig","newField","oldField","loggerInstance","hasNewField","hasOldField","_data$properties","requiredProperties","getPageViewId","_this$pageViewManager3","captureTraceFeedback","userFeedback","$ai_trace_id","$ai_feedback_text","captureTraceMetric","metricName","metricValue","$ai_metric_name","$ai_metric_value","debugConfig","explicitlyFalse","isTrueInLocalStorage","noop","klass","functions","RageClick","rageclickConfig","conf","thresholdPx","threshold_px","timeout_ms","clickCount","click_count","clicks","isRageClick","y","lastClick","COPY_AUTOCAPTURE_EVENT","limitText","previousElementSibling","_el","previousSibling","autocapturePropertiesForElement","_elementsJson$","_elementsJson$2","maskAllElementAttributes","maskAllText","elementAttributeIgnoreList","elementsChainAsString","externalHref","elementsJson","autocaptureAugmentProperties","explicitNoCapture","shouldCaptureEl","hrefAttr","elem","maskAllAttributes","maskText","elementAttributeIgnorelist","tag_name","attr","attributeName","nthChild","nthOfType","currentElem","augmentProperties","propertyKey","propertyValue","hrefHost","locationHost","$event_type","$ce_version","$elements","$elements_chain","_element$nth_child","_element$nth_of_type","el_string","single_class","nth_child","nth_of_type","attr_id","sortedAttributes","localeCompare","_el$$el_text","_el$attr__href","_ref6","_ref7","$el_text","$external_click_url","FIFTEEN_MINUTES_IN_MILLIS","DISABLED","LAZY_LOADING","AWAITING_CONFIG","MISSING_CONFIG","LOGGER_PREFIX","isValidMouseEvent","clientX","clientY","isProductToursEnabled","_instance$persistence","APP_INIT_ERROR","matchString","matching","likePattern","ActionMatcher","_debugEventEmitter","_checkStep","_checkStepEvent","_checkStepUrl","_checkStepElement","_checkStepProperties","_actionEvents","_actionRegistry","_this$_instance","_this$_instance2","matchEventToAction","eventPayload","actions","_this$_instance3","_this$_instance4","_this$_actionRegistry","_action$steps","steps","_this$_actionEvents","_this$_instance5","selectorsToWatch","_action$steps2","setElementSelectors","_this$_actionRegistry2","_checkAction","_addActionHook","onAction","_event$properties","eventUrl","url_matching","_checkStepHref","_checkStepText","_checkStepSelector","_event$properties2","_getElementsList","href_matching","chain","_event$properties3","text_matching","texts","elementsChain","_event$properties4","_event$properties5","elementSelectors","$element_selectors","selector_regex","_event$properties6","EventReceiver","_pendingActivatedItems","_eventToItems","_cancelEventToItems","_actionToItems","_onSessionIdChanged","_doesEventMatchFilter","eventConfig","_buildEventToItemMap","items","conditionField","_item$conditions","existing","_getMatchingItems","itemIds","_getItems","allItems","_item$conditions2","find","_setupEventBasedItems","_setupActionBasedItems","actionBasedItems","_item$conditions3","_item$conditions4","_actionMatcher","actionName","_item$conditions5","_item$conditions6","_item$conditions7","_this$_actionMatcher","_item$conditions8","knownItems","eventBasedItems","_item$conditions9","_item$conditions0","itemsWithCancelEvents","_item$conditions1","_item$conditions10","cancelEvents","matchEventToItem","onEvent","_eventPayload$propert","_eventPayload$propert2","_getLogger","itemId","$survey_id","$product_tour_id","getActivatedIds","_activationOutcome","_deactivateItems","_persistActivation","itemsToCancel","_cancelPendingItem","matchedItems","_activateItems","activatedItems","_getPersistedActivatedIds","_setActivatedItems","_stampActivationSession","_getRawPersistedActivatedIds","nextPersisted","_clearActivationSession","activatedKey","_getActivatedKey","_this$_instance6","ids","stampedSessionId","_getActivatedSessionKey","currentSessionId","_this$_instance7","_setActivatedSession","_clearActivatedSession","_this$_instance8","_isItemPermanentlyIneligible","getEventToItemsMap","_getActionMatcher","SurveyEventReceiver","super","_getShownEventName","eligibleItems","consumedOnShown","_survey$conditions2","repeatedActivation","schedule","getEventToSurveys","SURVEY_NOT_LOADED","SURVEY_DISABLED","STATE_FROM_WINDOW","LOCALSTORAGE_KEY","forceDebugLogger","FLAG_TIMEOUT_MSG","arrayToFlagsRecord","flagsObj","filterActiveFeatureFlags","BOT_REFUSE_MSG","webExperimentUrlValidationMap","conditionsUrl","WebExperiments","getWebExperimentsAndEvaluateDisplayLogic","getWebExperiments","webExperiments","_logInfo","_flagToExperiments","webExperiment","feature_flag_key","_this$_flagToExperime","selectedVariant","variants","_applyTransforms","transforms","variant","testVariant","_matchesTestVariant","previewWebExperiment","flag","_this$_flagToExperime2","_this$_flagToExperime3","getWindowLocation","experimentID","_showPreviewWebExperiment","previewing","existingWebExperiments","previewExperiments","exp","_matchUrlConditions","_matchUTMConditions","_testVariant$conditio","_testVariant$conditio2","_testVariant$conditio3","_testVariant$conditio4","urlMatchType","_testVariant$conditio5","utm","_testVariant$conditio6","_testVariant$conditio7","_testVariant$conditio8","_testVariant$conditio9","_testVariant$conditio0","_testVariant$conditio1","_testVariant$conditio10","_testVariant$conditio11","utmCampaignMatched","utmSourceMatched","utmMediumMatched","utmTermMatched","experiment","transform","_document","htmlElement","html","innerHTML","css","setAttribute","NOT_AVAILABLE","CONSOLE_SCOPE_NAME","FeatureFlagsExtensions","_override_warning","_hasLoadedFlags","_requestInFlight","_reloadingDisabled","_additionalReloadRequested","_flagsLoadedFromRemote","_hasLoggedDeprecationWarning","_staleCacheRefreshTriggered","_consecutiveStatusZeroFailures","_onOnline","wasTripped","_hasStatusZeroCircuitBreakerTripped","featureFlagEventHandlers","_prop","_isCacheStale","_this$_persistence$_i","_this$_persistence","_checkAndTriggerStaleRefresh","_getValidEvaluationEnvironments","_this$_config$evaluat","envs","evaluation_contexts","evaluation_environments","env","isValid","_shouldIncludeEvaluationEnvironments","_getValidFlagKeys","flagKeys","flag_keys","flagKey","_config$bootstrap$fea","bootstrapFlags","_config$bootstrap$fea2","bootstrapPayloads","featureFlagPayloads","activeFlags","receivedFeatureFlags","_this$_prop","_this$_prop2","existingFlags","merge","existingPayloads","finalFlags","finalPayloads","flagDetails","metadata","description","getFlags","getFlagVariants","getFlagsWithDetails","overridenFlags","overriddenPayloads","finalDetails","overriddenKeys","_originalDetail$enabl","_originalDetail$metad","originalDetail","overrideFlagValue","finalEnabled","overrideVariant","overridePayload","overridenDetail","original_enabled","original_variant","original_payload","flagVariants","getFlagPayloads","flagValue","enabledFlags","overriddenFlags","flagPayloads","_reloadDebouncer","_callFlagsEndpoint","_clearDebouncer","anon_distinct_id","setReloadingPaused","isPaused","_this$_persistence2","deviceId","person_properties","group_properties","timezone","disableFlags","disable_flags","isPartialFlagsResponse","_response$json","_response$json2","_this$_persistence3","_trackStatusZeroReachability","flagErrors","errorsWhileComputingFlags","_response$json3","isQuotaLimited","quotaLimited","partialResponse","_result$variant","fresh","getFeatureFlagDetails","send_event","flagExists","flagReportValue","requestId","flagCallReported","_this$_persistence4","storedSessionId","_this$_persistence5","_this$_prop3","_this$_config$bootstr2","_flagDetails$metadata","_flagDetails$metadata2","_flagDetails$reason$d","_flagDetails$reason","_flagDetails$reason2","_flagDetails$metadata3","_flagDetails$metadata4","errors","$feature_flag","$feature_flag_response","$feature_flag_payload","$feature_flag_request_id","$feature_flag_evaluated_at","$feature_flag_bootstrapped_response","$feature_flag_bootstrapped_payload","$used_bootstrap_value","has_experiment","$feature_flag_has_experiment","$feature_flag_version","_flagDetails$metadata5","code","$feature_flag_reason","$feature_flag_id","$feature_flag_original_response","$feature_flag_original_payload","$feature_flag_error","getRemoteConfigPayload","_response$json4","addFeatureFlagsHandler","removeFeatureFlagsHandler","currentFlags","currentFlagPayloads","currentFlagDetails","normalizedResponse","fromEntries","_flagDetails$flag$var","_flagDetails$flag$met","_flagDetails$flag$met2","$enabled_feature_flags","newFeatureFlags","newFeatureFlagPayloads","newFeatureFlagDetails","successfulKeys","_flagDetails$key","failed","minimalFlagCalledEvents","_fireFeatureFlagsCallbacks","suppressWarning","overrideFeatureFlags","overrideOptions","_options$suppressWarn","_this$_prepareFeature","_prepareFeatureFlagsForCallbacks","_this$_persistence6","feature","enrollmentPersonProp","$feature_enrollment","newFlags","existing_early_access_features","stageParams","_this$_persistence7","_this$_persistence8","earlyAccessFeatures","variantKey","_this$_prepareFeature2","existingProperties","propsToSet","propsToSetOnce","setOnceProps","nextProperties","SessionReplayExtensions","_this$_lazyLoadedSess","_lazyLoadedSessionRecording","isStarted","_this$_lazyLoadedSess2","_this$_lazyLoadedSess3","_recordingStatus","_forceAllowLocalhostNetworkCapture","_persistFlagsOnSessionListener","_isRecordingEnabled","_this$_instance$get_p","enabled_server_side","enabled_client_side","startReason","_this$_lazyLoadedSess4","canRunReplay","_lazyLoadAndStart","rrweb","initSessionRecording","_onScriptLoaded","_scriptName","_this$_persistFlagsOn","_this$_lazyLoadedSess5","_discardRecording","_this$_persistFlagsOn2","_this$_lazyLoadedSess6","discard","_resetSampling","_validateSampleRate","rate","_persistRemoteConfig","_this$_persistFlagsOn3","persistResponse","_this$_config$session","sessionRecordingConfigResponse","localSampleRate","sampleRate","remoteSampleRate","parsedSampleRate","receivedMinimumDuration","minimumDurationMilliseconds","cache_timestamp","networkPayloadCapture","capturePerformance","canvasRecording","recordCanvas","fps","canvasFps","quality","canvasQuality","triggerMatchType","masking","urlTriggers","triggerGroups","_this$_lazyLoadedSess7","_remoteConfig$scriptC","scriptConfig","script","_isRemoteConfigFresh","_config$cache_timesta","persistedConfig","cacheTimestamp","ONE_MINUTE","onRRwebEmit","rawEvent","_this$_lazyLoadedSess8","_this$_lazyLoadedSess9","_this$_lazyLoadedSess0","triggerType","_this$_lazyLoadedSess1","_this$_lazyLoadedSess10","$recording_status","tryAddCustomEvent","_this$_lazyLoadedSess11","AnalyticsExtensions","_initialized","_isDisabledServerSide","_hasReceivedConfigResponse","_elementsChainAsString","rageclicks","_elementSelectors","_config$url_allowlist","_config$url_ignorelis","url_allowlist","url_ignorelist","_addDomEventHandlers","isBrowserSupported","_captureEvent","capture_copied_text","copiedTextHandler","optOut","getElementSelectors","_this$_elementSelecto","matchedElements","matchedElement","_this$_isDisabledServ","persistedServerDisabled","memoryDisabled","clientConfigOnly","disabledServer","_this$rageclicks","MouseEvent","timeStamp","isCopyAutocapture","autocaptureConfig","allowedEventTypes","_autocaptureConfig$cs","dom_event_allowlist","allowlist","eventType","_getElementAndParents4","element_allowlist","elementType","css_selector_allowlist","_autocapturePropertie","element_attribute_ignorelist","_window$getSelection","selectedContent","getSelection","clipType","_lastPathname","monitorHistoryChanges","_popstateListener","history","_patchHistoryMethod","_setupPopstateListener","_window$history$metho","__posthog_wrapped__","replacement","layer","wrapped","defineProperties","enumerable","__posthog_layer__","currentLayer","originalMethod","_capturePageview","navigationType","_window$location2","currentPathname","navigation_type","_enabledServerSide","_flushInterval","flushIntervalMilliseconds","flushInterval","capture_heatmaps","flush_interval_milliseconds","enable_heatmaps","_setupListeners","_onVisibilityChange","_this$_flushInterval","_removeListeners","getAndClearBuffer","optIn","_onDeadClick","click","originalEvent","_onClick","_flushHandler","_onClickHandler","_onMouseMoveHandler","_onMouseMove","_deadClicksCapture","_onVisibilityChange_handler","_this$_deadClicksCapt","_mouseMoveTimeout","_getProperties","isFixedOrSticky","breakOnElement","position","_curEl$ownerDocument$","_curEl$ownerDocument","ownerDocument","defaultView","target_fixed","$heatmap_data","_this$_instance$persi","firstMetricTimestamp","_flushToCapture","_delayedFlushTimer","_addToBuffer","$currentUrl","_currentURL","_maxAllowedValue","flushToCaptureTimeoutMs","attribution","interactionTargetElement","sessionIds","bufferedMetric","$session_id","$window_id","allowedMetrics","_startCapturing","onLCP","onCLS","onFCP","onINP","posthogExtensions","postHogWebVitalsCallbacks","_posthogExtensions$po","_perfConfig","_this$_perfConfig","_this$_instance$persi2","clientConfigMetricAllowList","web_vitals_allowed_metrics","web_vitals_delayed_flush_ms","useAttribution","web_vitals_attribution","configured","__web_vitals_max_value","web_vitals","webVitalsOptIn","ErrorTrackingExtensions","errorWrappingFunctions","wrapOnError","wrapUnhandledRejection","wrapConsoleError","_unwrapOnError","capture_unhandled_errors","_unwrapUnhandledRejection","capture_unhandled_rejections","_unwrapConsoleError","capture_console_errors","_stopCapturing","_remoteEnabled","_rateLimiter","_config$exceptionRate","_config$exceptionRate2","exceptionRateLimiterRefillRate","__exceptionRateLimiterRefillRate","exceptionRateLimiterBucketSize","__exceptionRateLimiterBucketSize","_requiredConfig","providedConfig","_this$_unwrapOnError","_this$_unwrapUnhandle","_this$_unwrapConsoleE","autocaptureExceptions","errorProperties","_errorProperties$$exc","_errorProperties$$exc2","_this$_instance$excep","exceptionType","_suppressionRules","_errorPropertiesBuilder","ErrorTracking","parsers","lines","cleanedLine","parser","localStack","reverse","arr","_exceptionStepsConfig","_getExceptionStepsConfig","_exceptionStepsBuffer","_response$errorTracki","_response$errorTracki2","_response$errorTracki3","suppressionRules","errorTracking","captureExtensionExceptions","_captureExtensionExceptions","_ErrorTracking$stripR","sanitizedProperties","droppedKeys","_coerceExceptionStepProperties","EXCEPTION_STEP_INTERNAL_FIELDS_MESSAGE","EXCEPTION_STEP_INTERNAL_FIELDS_TIMESTAMP","_isExceptionList","_matchesSuppressionRule","_addDroppedExceptionStep","_isExtensionException","__capturePostHogExceptions","_isPostHogException","propertiesForExceptionCapture","$exception_steps","_addBufferedExceptionSteps","exceptionSteps","_this$_instance$confi2","exception_steps","exceptionValues","$exception_types","$exception_values","rule","results","_exceptionValues$v$ke","compare","flatMap","_e$stacktrace$frames","_e$stacktrace","startsWith","_exception$stacktrace","_exception$stacktrace2","_lastFrame$filename$i","_lastFrame$filename","lastFrame","ProductToursExtensions","_productTourManager","_cachedTours","_this$_productTourMan","clearCache","_startProductTours","generateProductTours","getProductTours","storedTours","tours","product_tours","getActiveProductTours","showProductTour","tourId","_this$_productTourMan2","showTourById","previewTour","tour","_this$_productTourMan3","dismissProductTour","_this$_productTourMan4","dismissTour","nextStep","_this$_productTourMan5","previousStep","_this$_productTourMan6","resetTour","_this$_productTourMan7","resetAllTours","_this$_productTourMan8","cancelPendingTour","_this$_productTourMan9","SiteAppsExtensions","_siteAppElementPatchCount","_bufferedInvocations","apps","_eventCollector","_eventName","globals","globalsForEvent","siteAppLoaders","_stopBuffering","_event$properties$$se","_event$properties$$se2","_event$properties$$el","groupIds","groupProperties","elements_chain","person","_prepareElementForSiteApp","_tagName","prepare_external_dependency_stylesheet","_patchSiteAppElementInsertionMethods","_win$Node","_win$Element","_win$Document","_win$DocumentFragment","_win$Element2","_win$CharacterData","_win$DocumentType","_win$Element3","nodePrototype","Node","_restoreSiteAppElementPatches","_releaseSiteAppElementPatches","restore","preparedNodes","WeakSet","patch","prepareNode","node","prepared","prepareNodes","nodes","newChild","refChild","oldChild","Document","DocumentFragment","CharacterData","DocumentType","insertedElement","released","_this$_restoreSiteApp","_runWithPreparedSiteAppElements","restoreSynchronously","setupSiteApp","loader","app","processBufferedEvents","_this$_stopBuffering","errored","processedBuffer","hasInitReturned","onLoaded","success","_setupSiteApps","_onCapturedEvent","_this$siteAppLoaders","_this$_stopBuffering2","_response$siteApps","TracingExtensions","_restoreXHRPatch","_restoreFetchPatch","_hostnamesForPatch","hostnames","_syncHostnamesForPatch","tracingHeadersPatchFns","_patchXHR","_patchFetch","_getConfiguredHostnames","tracing_headers","addTracingHeaders","__add_tracing_headers","_this$_restoreXHRPatc","_this$_restoreFetchPa","SurveysExtensions","_isSurveysEnabled","_surveyManager","_isInitializingSurveys","_surveyCallbacks","_getSurveysInFlightPromise","_lastSurveyRefreshFailedAt","_surveyEventReceiver","isArrayResponse","_this$_surveyEventRec","surveyKeys","phExtensions","isSurveysEnabled","generateSurveys","_completeSurveyInitialization","_handleSurveyLoadError","generateSurveysFn","_notifySurveyCallbacks","resolvePromise","existingSurveys","_shouldBackgroundRefreshSurveys","context","_this$_surveyEventRec2","eventOrActionBasedSurveys","start_date","end_date","_isSurveyCacheStale","_isSurveyRefreshBackingOff","surveysLoadedAt","SURVEYS_CACHE_TTL_MS","markSurveyAsSeen","_options$iteration","iteration","_getSurveyById","_surveys$find","_checkSurveyEligibility","eligible","checkSurveyEligibility","eligibility","_surveys$find2","_survey$appearance","appearance","surveyPopupDelaySeconds","_survey$appearance2","_this$_surveyManager","_survey$appearance3","surveyToDisplay","initialResponses","canRender","handlePopoverSurvey","cancelSurvey","_this$_surveyManager2","ToolbarExtensions","_setToolbarState","_getToolbarState","_assignableWindow$ph_","maybeLoadToolbar","toolbarParams","stateHash","atob","replaceState","userIntent","_callLoadToolbar","loadFn","toolbarRunning","getElementById","disableToolbarMetrics","apiURL","instrument","_loadEditor","maybeLoadEditor","ExperimentsExtensions","ConversationsExtensions","_isConversationsEnabled","_conversationsManager","_isInitializing","_remoteConfig","_this$_conversationsM","initConversations","_completeInitialization","_handleLoadError","initConversationsFn","show","hide","isAvailable","isVisible","_this$_conversationsM2","_this$_conversationsM3","sendMessage","userTraits","newTicket","getMessages","ticketId","after","markAsRead","getTickets","requestRestoreLink","email","restoreFromToken","restoreToken","_this6","restoreFromUrlToken","_this7","getCurrentTicketId","_this$_conversationsM4","_this$_conversationsM5","getWidgetSessionId","_this$_conversationsM6","_this$_conversationsM7","_this$_conversationsM8","_this$_conversationsM9","LogsExtensions","_isLogsEnabled","_isLoaded","_consoleQueue","_onReconnect","_this$_core","_this$_consoleCore","_core","_consoleCore","captureConsoleLogs","_buildCore","getQueue","setQueue","_config$flushInterval","_config$maxBufferSize","_config$maxLogsPerInt","consoleCapture","serviceNameDefault","backgroundFlushBudgetMs","terminationFlushBudgetMs","CorePostHogLogs","_createHost","_getSdkContext","_getCore","logsConfig","_resolvedFrom","_this$_core2","_this$_buildCore","q","_resolvedConfig","_getConsoleCore","_consoleResolvedFrom","_this$_consoleCore2","_this$_buildCore2","_consoleResolvedConfig","_result$config$logs","logCapture","_this$_core3","_this$_consoleCore3","_captureConsoleLog","_capture_logger","_flushViaTransport","_phExtensions$logs","initializeLogs","ph","settled","settle","timer","_logsUrl","_trackEndpointReachability","_response$error","_drainQueueViaTransport","records","_assignableWindow$loc","MetricsExtensions","metricsConfig","CorePostHogMetrics","_resourceAttributes$s","_resourceAttributes$s2","_resourceAttributes$d","_config$maxSeriesPerF","_metricsUrl","AllExtensions","posthogMain","dom_loaded_handler","inst","add_dom_loaded_handler"],"mappings":"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","file":"module-X3HTTRQK.js","sourcesContent":["const win = 'undefined' != typeof window ? window : void 0;\nconst global = 'undefined' != typeof globalThis ? globalThis : win;\nconst globals_navigator = global?.navigator;\nconst globals_document = global?.document;\nconst globals_location = global?.location;\nconst fetch = global?.fetch;\nconst XMLHttpRequest = global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : void 0;\nconst AbortController = global?.AbortController;\nconst CompressionStream = global?.CompressionStream;\nconst userAgent = globals_navigator?.userAgent;\nfunction isBrowserOnline() {\n return !!(win && false !== win.navigator.onLine);\n}\nexport { AbortController, CompressionStream, XMLHttpRequest, globals_document as document, fetch, isBrowserOnline, globals_location as location, globals_navigator as navigator, userAgent, win as window };\n","import { window as commonWindow } from '@posthog/browser-common/utils/globals'\nimport type { ErrorTracking } from '@posthog/core'\n\nimport type { PostHog } from '../posthog-core'\nimport type { SessionIdManager } from '../sessionid'\nimport type {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n RestoreFromTokenResponse,\n RequestRestoreLinkResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport type { TracingHeadersDistinctId, TracingHeadersHostnames } from '../extensions/tracing-headers-types'\nimport type { eventWithTime } from '../extensions/replay/types/rrweb-types'\n\n/*\n * Browser-v1's contract with its lazily loaded bundles and legacy window globals.\n * Generic environment access remains owned by browser-common.\n */\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n discard: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // Identity verification\n setIdentity: () => void\n clearIdentity: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n requestRestoreLink: (email: string) => Promise<RequestRestoreLinkResponse>\n restoreFromToken: (restoreToken: string) => Promise<RestoreFromTokenResponse>\n restoreFromUrlToken: () => Promise<RestoreFromTokenResponse | null>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (\n hostnames: TracingHeadersHostnames,\n distinctId: TracingHeadersDistinctId,\n sessionManager?: SessionIdManager\n ) => () => void\n _patchXHR: (\n hostnames: TracingHeadersHostnames,\n distinctId: TracingHeadersDistinctId,\n sessionManager?: SessionIdManager\n ) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst globalObject: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : commonWindow\n\n// React Native polyfills retained for browser-v1 compatibility.\nif (globalObject && typeof self === 'undefined') {\n ;(globalObject as any).self = globalObject\n}\nif (globalObject && typeof File === 'undefined') {\n ;(globalObject as any).File = function () {}\n}\n\nexport {\n AbortController,\n CompressionStream,\n document,\n fetch,\n isBrowserOnline,\n location,\n navigator,\n userAgent,\n window,\n XMLHttpRequest,\n} from '@posthog/browser-common/utils/globals'\n\nexport const assignableWindow: AssignableWindow = commonWindow ?? ({} as any)\n","const packageVersion = \"0.2.0\";\nconst Config = {\n DEBUG: false,\n LIB_VERSION: packageVersion,\n LIB_NAME: 'browser-common',\n JS_SDK_VERSION: packageVersion\n};\nconst config = Config;\nexport { config as default };\n","const normalizeFlagsResponse = (flagsResponse)=>{\n if ('flags' in flagsResponse) {\n const featureFlags = getFlagValuesFromFlags(flagsResponse.flags);\n const featureFlagPayloads = getPayloadsFromFlags(flagsResponse.flags);\n return {\n ...flagsResponse,\n featureFlags,\n featureFlagPayloads\n };\n }\n {\n const featureFlags = flagsResponse.featureFlags ?? {};\n const featureFlagPayloads = Object.fromEntries(Object.entries(flagsResponse.featureFlagPayloads || {}).map(([k, v])=>[\n k,\n parsePayload(v)\n ]));\n const flags = Object.fromEntries(Object.entries(featureFlags).map(([key, value])=>[\n key,\n getFlagDetailFromFlagAndPayload(key, value, featureFlagPayloads[key])\n ]));\n return {\n ...flagsResponse,\n featureFlags,\n featureFlagPayloads,\n flags\n };\n }\n};\nfunction getFlagDetailFromFlagAndPayload(key, value, payload) {\n return {\n key: key,\n enabled: 'string' == typeof value ? true : value,\n variant: 'string' == typeof value ? value : void 0,\n reason: void 0,\n metadata: {\n id: void 0,\n version: void 0,\n payload: payload ? JSON.stringify(payload) : void 0,\n description: void 0\n }\n };\n}\nconst getFlagValuesFromFlags = (flags)=>Object.fromEntries(Object.entries(flags ?? {}).map(([key, detail])=>[\n key,\n getFeatureFlagValue(detail)\n ]).filter(([, value])=>void 0 !== value));\nconst getPayloadsFromFlags = (flags)=>{\n const safeFlags = flags ?? {};\n return Object.fromEntries(Object.keys(safeFlags).filter((flag)=>{\n const details = safeFlags[flag];\n return details.enabled && details.metadata && void 0 !== details.metadata.payload;\n }).map((flag)=>{\n const payload = safeFlags[flag].metadata?.payload;\n return [\n flag,\n payload ? parsePayload(payload) : void 0\n ];\n }));\n};\nconst getFeatureFlagValue = (detail)=>void 0 === detail ? void 0 : detail.variant ?? detail.enabled;\nconst parsePayload = (response)=>{\n if ('string' != typeof response) return response;\n try {\n return JSON.parse(response);\n } catch {\n return response;\n }\n};\nconst createFlagsResponseFromFlagsAndPayloads = (featureFlags, featureFlagPayloads)=>{\n const allKeys = [\n ...new Set([\n ...Object.keys(featureFlags ?? {}),\n ...Object.keys(featureFlagPayloads ?? {})\n ])\n ];\n const enabledFlags = allKeys.filter((flag)=>!!featureFlags[flag] || !!featureFlagPayloads[flag]).reduce((res, key)=>(res[key] = featureFlags[key] ?? true, res), {});\n const flagDetails = {\n featureFlags: enabledFlags,\n featureFlagPayloads: featureFlagPayloads ?? {}\n };\n return normalizeFlagsResponse(flagDetails);\n};\nconst updateFlagValue = (flag, value)=>({\n ...flag,\n enabled: getEnabledFromValue(value),\n variant: getVariantFromValue(value)\n });\nfunction getEnabledFromValue(value) {\n return 'string' == typeof value ? true : value;\n}\nfunction getVariantFromValue(value) {\n return 'string' == typeof value ? value : void 0;\n}\nconst flagDetailsToResults = (flagDetails)=>Object.values(flagDetails).map((detail)=>{\n const value = detail.variant ?? detail.enabled;\n const rawPayload = detail.metadata?.payload;\n return {\n key: detail.key,\n enabled: getEnabledFromValue(value),\n variant: getVariantFromValue(value),\n payload: void 0 !== rawPayload ? parsePayload(rawPayload) : null\n };\n });\nconst MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = [\n '$feature_flag',\n '$feature_flag_response',\n '$feature_flag_has_experiment',\n '$feature_flag_id',\n '$feature_flag_version',\n '$feature_flag_reason',\n '$feature_flag_request_id',\n '$feature_flag_evaluated_at',\n '$feature_flag_error',\n 'locally_evaluated',\n '$groups',\n '$process_person_profile',\n '$geoip_disable',\n '$current_url',\n '$pathname',\n '$session_id',\n '$window_id',\n '$lib',\n '$lib_version',\n '$device_id',\n '$is_server'\n];\nconst minimizeFlagCalledEventProperties = (properties, transportKeys = [])=>{\n const minimal = {};\n const copyKey = (key)=>{\n if (void 0 !== properties[key]) minimal[key] = properties[key];\n };\n MINIMAL_FLAG_CALLED_EVENT_PROPERTIES.forEach(copyKey);\n transportKeys.forEach(copyKey);\n return minimal;\n};\nexport { MINIMAL_FLAG_CALLED_EVENT_PROPERTIES, createFlagsResponseFromFlagsAndPayloads, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, minimizeFlagCalledEventProperties, normalizeFlagsResponse, parsePayload, updateFlagValue };\n","import { Compression } from \"./types.mjs\";\nfunction isGzipSupported() {\n return 'CompressionStream' in globalThis && 'TextEncoder' in globalThis && 'Response' in globalThis && 'function' == typeof Response.prototype.blob;\n}\nconst NATIVE_GZIP_VALIDATION_ERROR = 'NativeGzipValidationError';\nconst GZIP_MAGIC_FIRST_BYTE = 0x1f;\nconst GZIP_MAGIC_SECOND_BYTE = 0x8b;\nconst GZIP_DEFLATE_METHOD = 0x08;\nconst hasGzipMagic = (bytes)=>bytes.length >= 2 && bytes[0] === GZIP_MAGIC_FIRST_BYTE && bytes[1] === GZIP_MAGIC_SECOND_BYTE;\nconst isGzipData = (body)=>{\n if (body instanceof ArrayBuffer) return hasGzipMagic(new Uint8Array(body));\n if (ArrayBuffer.isView(body)) return hasGzipMagic(new Uint8Array(body.buffer, body.byteOffset, body.byteLength));\n return false;\n};\nconst isGzipRequest = (compression, urlCompression)=>compression === Compression.GZipJS || urlCompression === Compression.GZipJS || 'gzip' === urlCompression;\nconst isNativeAsyncGzipReadError = (error)=>{\n if (!error || 'object' != typeof error) return false;\n const name = 'name' in error ? String(error.name) : '';\n return 'NotReadableError' === name;\n};\nconst isNativeAsyncGzipError = (error)=>{\n if (!error || 'object' != typeof error) return false;\n const name = 'name' in error ? String(error.name) : '';\n return isNativeAsyncGzipReadError(error) || name === NATIVE_GZIP_VALIDATION_ERROR;\n};\nlet crc32Table;\nconst getCrc32Table = ()=>{\n if (crc32Table) return crc32Table;\n crc32Table = [];\n for(let i = 0; i < 256; i++){\n let crc = i;\n for(let j = 0; j < 8; j++)crc = 1 & crc ? 0xedb88320 ^ crc >>> 1 : crc >>> 1;\n crc32Table[i] = crc >>> 0;\n }\n return crc32Table;\n};\nconst crc32 = (bytes)=>{\n const table = getCrc32Table();\n let crc = 0xffffffff;\n for(let i = 0; i < bytes.length; i++)crc = table[(crc ^ bytes[i]) & 0xff] ^ crc >>> 8;\n return (0xffffffff ^ crc) >>> 0;\n};\nconst throwNativeGzipValidationError = (reason)=>{\n const error = new Error(`Native gzip produced invalid output: ${reason}`);\n error.name = NATIVE_GZIP_VALIDATION_ERROR;\n throw error;\n};\nconst validateNativeGzip = async (compressed, inputBytes)=>{\n if (compressed.size < 18) throwNativeGzipValidationError('too-short');\n const header = new Uint8Array(await compressed.slice(0, 10).arrayBuffer());\n if (!hasGzipMagic(header) || header[2] !== GZIP_DEFLATE_METHOD) throwNativeGzipValidationError('invalid-header');\n const trailer = new DataView(await compressed.slice(compressed.size - 8).arrayBuffer());\n if (trailer.getUint32(0, true) !== crc32(inputBytes)) throwNativeGzipValidationError('invalid-crc');\n const inputSize = inputBytes.length >>> 0;\n if (trailer.getUint32(4, true) !== inputSize) throwNativeGzipValidationError('invalid-size');\n};\nasync function gzipCompress(input, isDebug = true, options) {\n try {\n const inputBytes = new TextEncoder().encode(input);\n const compressedStream = new globalThis.CompressionStream('gzip');\n const writer = compressedStream.writable.getWriter();\n const writePromise = writer.write(inputBytes).then(()=>writer.close()).catch(async (err)=>{\n try {\n await writer.abort(err);\n } catch {}\n throw err;\n });\n const responsePromise = new Response(compressedStream.readable).blob();\n const [compressed] = await Promise.all([\n responsePromise,\n writePromise\n ]);\n await validateNativeGzip(compressed, inputBytes);\n return compressed;\n } catch (error) {\n if (options?.rethrow) throw error;\n if (isDebug) console.error('Failed to gzip compress data', error);\n return null;\n }\n}\nexport { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError };\n","var types_PostHogPersistedProperty = /*#__PURE__*/ function(PostHogPersistedProperty) {\n PostHogPersistedProperty[\"AnonymousId\"] = \"anonymous_id\";\n PostHogPersistedProperty[\"DistinctId\"] = \"distinct_id\";\n PostHogPersistedProperty[\"Props\"] = \"props\";\n PostHogPersistedProperty[\"EnablePersonProcessing\"] = \"enable_person_processing\";\n PostHogPersistedProperty[\"PersonMode\"] = \"person_mode\";\n PostHogPersistedProperty[\"FeatureFlagDetails\"] = \"feature_flag_details\";\n PostHogPersistedProperty[\"FeatureFlags\"] = \"feature_flags\";\n PostHogPersistedProperty[\"FeatureFlagPayloads\"] = \"feature_flag_payloads\";\n PostHogPersistedProperty[\"BootstrapFeatureFlagDetails\"] = \"bootstrap_feature_flag_details\";\n PostHogPersistedProperty[\"BootstrapFeatureFlags\"] = \"bootstrap_feature_flags\";\n PostHogPersistedProperty[\"BootstrapFeatureFlagPayloads\"] = \"bootstrap_feature_flag_payloads\";\n PostHogPersistedProperty[\"OverrideFeatureFlags\"] = \"override_feature_flags\";\n PostHogPersistedProperty[\"Queue\"] = \"queue\";\n PostHogPersistedProperty[\"AiQueue\"] = \"ai_queue\";\n PostHogPersistedProperty[\"LogsQueue\"] = \"logs_queue\";\n PostHogPersistedProperty[\"OptedOut\"] = \"opted_out\";\n PostHogPersistedProperty[\"SessionId\"] = \"session_id\";\n PostHogPersistedProperty[\"SessionStartTimestamp\"] = \"session_start_timestamp\";\n PostHogPersistedProperty[\"SessionLastTimestamp\"] = \"session_timestamp\";\n PostHogPersistedProperty[\"PersonProperties\"] = \"person_properties\";\n PostHogPersistedProperty[\"GroupProperties\"] = \"group_properties\";\n PostHogPersistedProperty[\"InstalledAppBuild\"] = \"installed_app_build\";\n PostHogPersistedProperty[\"InstalledAppVersion\"] = \"installed_app_version\";\n PostHogPersistedProperty[\"SessionReplay\"] = \"session_replay\";\n PostHogPersistedProperty[\"SessionReplayEventTriggerActivatedSession\"] = \"session_replay_event_trigger_activated_session\";\n PostHogPersistedProperty[\"SurveyLastSeenDate\"] = \"survey_last_seen_date\";\n PostHogPersistedProperty[\"SurveysSeen\"] = \"surveys_seen\";\n PostHogPersistedProperty[\"Surveys\"] = \"surveys\";\n PostHogPersistedProperty[\"RemoteConfig\"] = \"remote_config\";\n PostHogPersistedProperty[\"FlagsEndpointWasHit\"] = \"flags_endpoint_was_hit\";\n PostHogPersistedProperty[\"DeviceId\"] = \"device_id\";\n return PostHogPersistedProperty;\n}({});\nvar types_Compression = /*#__PURE__*/ function(Compression) {\n Compression[\"GZipJS\"] = \"gzip-js\";\n Compression[\"Base64\"] = \"base64\";\n return Compression;\n}({});\nconst FeatureFlagError = {\n ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n FLAG_MISSING: 'flag_missing',\n QUOTA_LIMITED: 'quota_limited',\n TIMEOUT: 'timeout',\n CONNECTION_ERROR: 'connection_error',\n UNKNOWN_ERROR: 'unknown_error',\n apiError: (status)=>`api_error_${status}`\n};\nconst SurveyPosition = {\n TopLeft: 'top_left',\n TopCenter: 'top_center',\n TopRight: 'top_right',\n MiddleLeft: 'middle_left',\n MiddleCenter: 'middle_center',\n MiddleRight: 'middle_right',\n Left: 'left',\n Right: 'right',\n Center: 'center'\n};\nconst SurveyWidgetType = {\n Button: 'button',\n Tab: 'tab',\n Selector: 'selector'\n};\nconst SurveyType = {\n Popover: 'popover',\n API: 'api',\n Widget: 'widget',\n ExternalSurvey: 'external_survey'\n};\nconst SurveyQuestionDescriptionContentType = {\n Html: 'html',\n Text: 'text'\n};\nconst SurveyValidationType = {\n MinLength: 'min_length',\n MaxLength: 'max_length'\n};\nconst SurveyRatingDisplay = {\n Number: 'number',\n Emoji: 'emoji'\n};\nconst SurveyQuestionType = {\n Open: 'open',\n MultipleChoice: 'multiple_choice',\n SingleChoice: 'single_choice',\n Rating: 'rating',\n Link: 'link'\n};\nconst SurveyQuestionBranchingType = {\n NextQuestion: 'next_question',\n End: 'end',\n ResponseBased: 'response_based',\n SpecificQuestion: 'specific_question'\n};\nconst SurveyMatchType = {\n Regex: 'regex',\n NotRegex: 'not_regex',\n Exact: 'exact',\n IsNot: 'is_not',\n Icontains: 'icontains',\n NotIcontains: 'not_icontains'\n};\nconst SurveySchedule = {\n Once: 'once',\n Recurring: 'recurring',\n Always: 'always'\n};\nconst ActionStepStringMatching = {\n Contains: 'contains',\n Exact: 'exact',\n Regex: 'regex'\n};\nconst knownUnsafeEditableEvent = [\n '$snapshot',\n '$pageview',\n '$pageleave',\n '$set',\n 'survey dismissed',\n 'survey sent',\n 'survey shown',\n '$identify',\n '$groupidentify',\n '$create_alias',\n '$$client_ingestion_warning',\n '$web_experiment_applied',\n '$feature_enrollment_update',\n '$feature_flag_called'\n];\nconst knownUnsafeEditableEventProperty = [\n 'token'\n];\nexport { ActionStepStringMatching, types_Compression as Compression, FeatureFlagError, types_PostHogPersistedProperty as PostHogPersistedProperty, SurveyMatchType, SurveyPosition, SurveyQuestionBranchingType, SurveyQuestionDescriptionContentType, SurveyQuestionType, SurveyRatingDisplay, SurveySchedule, SurveyType, SurveyValidationType, SurveyWidgetType, knownUnsafeEditableEvent, knownUnsafeEditableEventProperty };\n","const DEFAULT_BLOCKED_UA_STRS = [\n 'amazonbot',\n 'amazonproductbot',\n 'app.hypefactors.com',\n 'applebot',\n 'archive.org_bot',\n 'awariobot',\n 'backlinksextendedbot',\n 'baiduspider',\n 'bingbot',\n 'bingpreview',\n 'chrome-lighthouse',\n 'dataforseobot',\n 'deepscan',\n 'duckduckbot',\n 'facebookexternal',\n 'facebookcatalog',\n 'http://yandex.com/bots',\n 'hubspot',\n 'ia_archiver',\n 'leikibot',\n 'linkedinbot',\n 'meta-externalagent',\n 'mj12bot',\n 'msnbot',\n 'nessus',\n 'petalbot',\n 'pinterest',\n 'prerender',\n 'rogerbot',\n 'screaming frog',\n 'sebot-wa',\n 'sitebulb',\n 'slackbot',\n 'slurp',\n 'trendictionbot',\n 'turnitin',\n 'twitterbot',\n 'vercel-screenshot',\n 'vercelbot',\n 'yahoo! slurp',\n 'yandexbot',\n 'zoombot',\n 'bot.htm',\n 'bot.php',\n '(bot;',\n 'bot/',\n 'crawler',\n 'ahrefsbot',\n 'ahrefssiteaudit',\n 'semrushbot',\n 'siteauditbot',\n 'splitsignalbot',\n 'gptbot',\n 'oai-searchbot',\n 'chatgpt-user',\n 'perplexitybot',\n 'better uptime bot',\n 'sentryuptimebot',\n 'uptimerobot',\n 'headlesschrome',\n 'cypress',\n 'google-hoteladsverifier',\n 'adsbot-google',\n 'apis-google',\n 'duplexweb-google',\n 'feedfetcher-google',\n 'google favicon',\n 'google web preview',\n 'google-read-aloud',\n 'googlebot',\n 'googleother',\n 'google-cloudvertexbot',\n 'googleweblight',\n 'mediapartners-google',\n 'storebot-google',\n 'google-inspectiontool',\n 'bytespider'\n];\nconst isBlockedUA = function(ua, customBlockedUserAgents = []) {\n if (!ua) return false;\n const uaLower = ua.toLowerCase();\n return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents).some((blockedUA)=>{\n const blockedUaLower = blockedUA.toLowerCase();\n return -1 !== uaLower.indexOf(blockedUaLower);\n });\n};\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA };\n","function includes(str, needle) {\n return -1 !== str.indexOf(needle);\n}\nconst trim = function(str) {\n return str.trim();\n};\nconst stripLeadingDollar = function(s) {\n return s.replace(/^\\$/, '');\n};\nfunction isDistinctIdStringLike(value) {\n return [\n 'distinct_id',\n 'distinctid'\n ].includes(value.toLowerCase());\n}\nfunction safeJsonStringify(value) {\n const ancestors = [];\n return JSON.stringify(value, function(_key, replacementValue) {\n if ('bigint' == typeof replacementValue) return replacementValue.toString();\n if ('function' == typeof replacementValue || 'symbol' == typeof replacementValue) return;\n if (replacementValue instanceof Error) return {\n name: replacementValue.name,\n message: replacementValue.message,\n stack: replacementValue.stack\n };\n if (replacementValue && 'object' == typeof replacementValue) {\n while(ancestors.length > 0 && ancestors[ancestors.length - 1] !== this)ancestors.pop();\n if (ancestors.includes(replacementValue)) return '[Circular]';\n ancestors.push(replacementValue);\n }\n return replacementValue;\n }) ?? 'null';\n}\nfunction deepSortKeys(value) {\n if (null === value || 'object' != typeof value) return value;\n if (Array.isArray(value)) return value.map(deepSortKeys);\n return Object.keys(value).sort().reduce((acc, key)=>{\n acc[key] = deepSortKeys(value[key]);\n return acc;\n }, {});\n}\nfunction getPersonPropertiesHash(distinct_id, userPropertiesToSet, userPropertiesToSetOnce) {\n return JSON.stringify({\n distinct_id,\n userPropertiesToSet: userPropertiesToSet ? deepSortKeys(userPropertiesToSet) : void 0,\n userPropertiesToSetOnce: userPropertiesToSetOnce ? deepSortKeys(userPropertiesToSetOnce) : void 0\n });\n}\nexport { getPersonPropertiesHash, includes, isDistinctIdStringLike, safeJsonStringify, stripLeadingDollar, trim };\n","import { knownUnsafeEditableEvent, knownUnsafeEditableEventProperty } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nconst isKnownUnsafeEditableEventProperty = (x)=>includes(knownUnsafeEditableEventProperty, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return 'undefined' != typeof Event && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isKnownUnsafeEditableEventProperty, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import { isNumber } from \"./type-utils.mjs\";\nfunction clampToRange(value, min, max, logger, fallbackValue) {\n if (min > max) {\n logger.warn('min cannot be greater than max.');\n min = max;\n }\n if (isNumber(value)) if (value > max) {\n logger.warn(' cannot be greater than max: ' + max + '. Using max value instead.');\n return max;\n } else {\n if (!(value < min)) return value;\n logger.warn(' cannot be less than min: ' + min + '. Using min value instead.');\n return min;\n }\n logger.warn(' must be a number. using max or fallback. max: ' + max + ', fallback: ' + fallbackValue);\n return clampToRange(fallbackValue || max, min, max, logger);\n}\nfunction getRemoteConfigBool(field, key, defaultValue = true) {\n if (null == field) return defaultValue;\n if ('boolean' == typeof field) return field;\n if ('object' == typeof field) {\n const value = field[key];\n return 'boolean' == typeof value ? value : defaultValue;\n }\n return defaultValue;\n}\nfunction getRemoteConfigNumber(field, key) {\n if (null == field || 'object' != typeof field) return;\n const value = field[key];\n if ('number' == typeof value && Number.isFinite(value)) return value;\n if ('string' == typeof value) {\n const trimmed = value.trim();\n if ('' === trimmed) return;\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : void 0;\n }\n}\nfunction isValidSampleRate(value) {\n return 'number' == typeof value && Number.isFinite(value) && value >= 0 && value <= 1;\n}\nexport { clampToRange, getRemoteConfigBool, getRemoteConfigNumber, isValidSampleRate };\n","import { clampToRange } from \"./number-utils.mjs\";\nconst ONE_DAY_IN_MS = 86400000;\nconst DEFAULT_EXCEPTION_RATE_LIMITER_REFILL_RATE = 1;\nconst DEFAULT_EXCEPTION_RATE_LIMITER_BUCKET_SIZE = 10;\nfunction resolveExceptionRateLimiterConfig(config = {}) {\n return {\n refillRate: config.exceptionRateLimiterRefillRate ?? config.__exceptionRateLimiterRefillRate ?? DEFAULT_EXCEPTION_RATE_LIMITER_REFILL_RATE,\n bucketSize: config.exceptionRateLimiterBucketSize ?? config.__exceptionRateLimiterBucketSize ?? DEFAULT_EXCEPTION_RATE_LIMITER_BUCKET_SIZE\n };\n}\nclass BucketedRateLimiter {\n constructor(options){\n this._buckets = {};\n this._onBucketRateLimited = options._onBucketRateLimited;\n this._bucketSize = clampToRange(options.bucketSize, 0, 100, options._logger);\n this._refillRate = clampToRange(options.refillRate, 0, this._bucketSize, options._logger);\n this._refillInterval = clampToRange(options.refillInterval, 0, ONE_DAY_IN_MS, options._logger);\n }\n _applyRefill(bucket, now) {\n const elapsedMs = now - bucket.lastAccess;\n const refillIntervals = Math.floor(elapsedMs / this._refillInterval);\n if (refillIntervals > 0) {\n const tokensToAdd = refillIntervals * this._refillRate;\n bucket.tokens = Math.min(bucket.tokens + tokensToAdd, this._bucketSize);\n bucket.lastAccess = bucket.lastAccess + refillIntervals * this._refillInterval;\n }\n }\n consumeRateLimit(key) {\n const now = Date.now();\n const keyStr = String(key);\n let bucket = this._buckets[keyStr];\n if (bucket) this._applyRefill(bucket, now);\n else {\n bucket = {\n tokens: this._bucketSize,\n lastAccess: now\n };\n this._buckets[keyStr] = bucket;\n }\n if (0 === bucket.tokens) return true;\n bucket.tokens--;\n if (0 === bucket.tokens) this._onBucketRateLimited?.(key);\n return 0 === bucket.tokens;\n }\n stop() {\n this._buckets = {};\n }\n}\nexport { BucketedRateLimiter, DEFAULT_EXCEPTION_RATE_LIMITER_BUCKET_SIZE, DEFAULT_EXCEPTION_RATE_LIMITER_REFILL_RATE, resolveExceptionRateLimiterConfig };\n","import { includes } from \"./string-utils.mjs\";\nimport { isFunction, isUndefined } from \"./type-utils.mjs\";\nconst FACEBOOK = 'Facebook';\nconst MOBILE = 'Mobile';\nconst IOS = 'iOS';\nconst ANDROID = 'Android';\nconst TABLET = 'Tablet';\nconst ANDROID_TABLET = ANDROID + ' ' + TABLET;\nconst IPAD = 'iPad';\nconst APPLE = 'Apple';\nconst APPLE_WATCH = APPLE + ' Watch';\nconst SAFARI = 'Safari';\nconst BLACKBERRY = 'BlackBerry';\nconst SAMSUNG = 'Samsung';\nconst SAMSUNG_BROWSER = SAMSUNG + 'Browser';\nconst SAMSUNG_INTERNET = SAMSUNG + ' Internet';\nconst CHROME = 'Chrome';\nconst CHROME_OS = CHROME + ' OS';\nconst CHROME_IOS = CHROME + ' ' + IOS;\nconst INTERNET_EXPLORER = 'Internet Explorer';\nconst INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE;\nconst OPERA = 'Opera';\nconst OPERA_MINI = OPERA + ' Mini';\nconst EDGE = 'Edge';\nconst MICROSOFT_EDGE = 'Microsoft ' + EDGE;\nconst FIREFOX = 'Firefox';\nconst FIREFOX_IOS = FIREFOX + ' ' + IOS;\nconst NINTENDO = 'Nintendo';\nconst PLAYSTATION = 'PlayStation';\nconst XBOX = 'Xbox';\nconst ANDROID_MOBILE = ANDROID + ' ' + MOBILE;\nconst MOBILE_SAFARI = MOBILE + ' ' + SAFARI;\nconst WINDOWS = 'Windows';\nconst WINDOWS_PHONE = WINDOWS + ' Phone';\nconst NOKIA = 'Nokia';\nconst OUYA = 'Ouya';\nconst GENERIC = 'Generic';\nconst GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase();\nconst GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase();\nconst KONQUEROR = 'Konqueror';\nconst OCULUS_BROWSER = 'Oculus Browser';\nconst VIVALDI = 'Vivaldi';\nconst YANDEX = 'Yandex';\nconst WHALE = 'Whale';\nconst DUCKDUCKGO = 'DuckDuckGo';\nconst PALE_MOON = 'Pale Moon';\nconst WATERFOX = 'Waterfox';\nconst BRAVE = 'Brave';\nconst GOOGLE_SEARCH_APP = 'Google Search App';\nconst BROWSER_VERSION_REGEX_SUFFIX = '(\\\\d+(\\\\.\\\\d+)?)';\nconst DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX);\nfunction browserFromHints(hints) {\n if (hints?.brave) return BRAVE;\n return null;\n}\nconst XBOX_REGEX = new RegExp(XBOX, 'i');\nconst PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\\\w+', 'i');\nconst NINTENDO_REGEX = new RegExp(NINTENDO + ' \\\\w+', 'i');\nconst BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i');\nconst windowsVersionMap = {\n 'NT3.51': 'NT 3.11',\n 'NT4.0': 'NT 4.0',\n '5.0': '2000',\n '5.1': 'XP',\n '5.2': 'XP',\n '6.0': 'Vista',\n '6.1': '7',\n '6.2': '8',\n '6.3': '8.1',\n '6.4': '10',\n '10.0': '10'\n};\nfunction isSafari(userAgent) {\n return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID);\n}\nconst safariCheck = (ua, vendor)=>vendor && includes(vendor, APPLE) || isSafari(ua);\nconst detectBrowser = function(user_agent, vendor, hints, options) {\n vendor = vendor || '';\n const fromHints = browserFromHints(hints);\n if (fromHints) return fromHints;\n if (options?.detectGoogleSearchApp && includes(user_agent, 'GSA/')) return GOOGLE_SEARCH_APP;\n if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) return OPERA_MINI;\n if (includes(user_agent, ' OPR/')) return OPERA;\n if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) return INTERNET_EXPLORER_MOBILE;\n if (includes(user_agent, 'OculusBrowser')) return OCULUS_BROWSER;\n else if (includes(user_agent, SAMSUNG_BROWSER)) return SAMSUNG_INTERNET;\n else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) return MICROSOFT_EDGE;\n else if (includes(user_agent, VIVALDI + '/')) return VIVALDI;\n else if (includes(user_agent, 'YaBrowser/')) return YANDEX;\n else if (includes(user_agent, WHALE + '/')) return WHALE;\n else if (includes(user_agent, DUCKDUCKGO + '/') || includes(user_agent, 'Ddg/')) return DUCKDUCKGO;\n else if (includes(user_agent, 'FBIOS')) return FACEBOOK + ' ' + MOBILE;\n else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) return 'UC Browser';\n else if (includes(user_agent, 'CriOS')) return CHROME_IOS;\n else if (includes(user_agent, 'CrMo')) return CHROME;\n else if (includes(user_agent, CHROME)) return CHROME;\n else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) return ANDROID_MOBILE;\n else if (includes(user_agent, 'FxiOS')) return FIREFOX_IOS;\n else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) return KONQUEROR;\n else if (includes(user_agent, BRAVE + '/')) return BRAVE;\n else if (safariCheck(user_agent, vendor)) return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI;\n else if (includes(user_agent, 'PaleMoon/')) return PALE_MOON;\n else if (includes(user_agent, WATERFOX + '/')) return WATERFOX;\n else if (includes(user_agent, FIREFOX)) return FIREFOX;\n else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) return INTERNET_EXPLORER;\n else if (includes(user_agent, 'Gecko')) return FIREFOX;\n return '';\n};\nconst versionRegexes = {\n [INTERNET_EXPLORER_MOBILE]: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [MICROSOFT_EDGE]: [\n new RegExp(EDGE + '?\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME]: [\n new RegExp('(' + CHROME + '|CrMo)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [CHROME_IOS]: [\n new RegExp('CriOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n 'UC Browser': [\n new RegExp('(UCBrowser|UCWEB)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [MOBILE_SAFARI]: [\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [OPERA]: [\n new RegExp('(' + OPERA + '|OPR)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX]: [\n new RegExp(FIREFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [FIREFOX_IOS]: [\n new RegExp('FxiOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [KONQUEROR]: [\n new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [BLACKBERRY]: [\n new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX),\n DEFAULT_BROWSER_VERSION_REGEX\n ],\n [ANDROID_MOBILE]: [\n new RegExp('android\\\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n ],\n [SAMSUNG_INTERNET]: [\n new RegExp(SAMSUNG_BROWSER + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [OCULUS_BROWSER]: [\n new RegExp('OculusBrowser\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [VIVALDI]: [\n new RegExp(VIVALDI + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [YANDEX]: [\n new RegExp('YaBrowser\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [WHALE]: [\n new RegExp(WHALE + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [BRAVE]: [\n new RegExp(BRAVE + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [DUCKDUCKGO]: [\n new RegExp('(DuckDuckGo|Ddg)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [PALE_MOON]: [\n new RegExp('PaleMoon\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [WATERFOX]: [\n new RegExp(WATERFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [GOOGLE_SEARCH_APP]: [\n new RegExp('GSA\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n [INTERNET_EXPLORER]: [\n new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)\n ],\n Mozilla: [\n new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n ]\n};\nconst detectBrowserVersion = function(userAgent, vendor, hints, options) {\n const browser = detectBrowser(userAgent, vendor, hints, options);\n const regexes = versionRegexes[browser];\n if (isUndefined(regexes)) return null;\n for(let i = 0; i < regexes.length; i++){\n const regex = regexes[i];\n const matches = userAgent.match(regex);\n if (matches) return parseFloat(matches[matches.length - 2]);\n }\n return null;\n};\nconst osMatchers = [\n [\n new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),\n (match)=>[\n XBOX,\n match && match[1] || ''\n ]\n ],\n [\n new RegExp(NINTENDO, 'i'),\n [\n NINTENDO,\n ''\n ]\n ],\n [\n new RegExp(PLAYSTATION, 'i'),\n [\n PLAYSTATION,\n ''\n ]\n ],\n [\n BLACKBERRY_REGEX,\n [\n BLACKBERRY,\n ''\n ]\n ],\n [\n new RegExp(WINDOWS, 'i'),\n (_, user_agent)=>{\n if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) return [\n WINDOWS_PHONE,\n ''\n ];\n if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\\b/.test(user_agent)) return [\n WINDOWS + ' ' + MOBILE,\n ''\n ];\n const match = /Windows NT ([0-9.]+)/i.exec(user_agent);\n if (match && match[1]) {\n const version = match[1];\n let osVersion = windowsVersionMap[version] || '';\n if (/arm/i.test(user_agent)) osVersion = 'RT';\n return [\n WINDOWS,\n osVersion\n ];\n }\n return [\n WINDOWS,\n ''\n ];\n }\n ],\n [\n /((iPhone|iPad|iPod).*?OS (\\d+)_(\\d+)_?(\\d+)?|iPhone)/,\n (match)=>{\n if (match && match[3]) {\n const versionParts = [\n match[3],\n match[4],\n match[5] || '0'\n ];\n return [\n IOS,\n versionParts.join('.')\n ];\n }\n return [\n IOS,\n ''\n ];\n }\n ],\n [\n /(watch.*\\/(\\d+\\.\\d+\\.\\d+)|watch os,(\\d+\\.\\d+),)/i,\n (match)=>{\n let version = '';\n if (match && match.length >= 3) version = isUndefined(match[2]) ? match[3] : match[2];\n return [\n 'watchOS',\n version\n ];\n }\n ],\n [\n new RegExp('(' + ANDROID + ' (\\\\d+)\\\\.(\\\\d+)\\\\.?(\\\\d+)?|' + ANDROID + ')', 'i'),\n (match)=>{\n if (match && match[2]) {\n const versionParts = [\n match[2],\n match[3],\n match[4] || '0'\n ];\n return [\n ANDROID,\n versionParts.join('.')\n ];\n }\n return [\n ANDROID,\n ''\n ];\n }\n ],\n [\n /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i,\n (match)=>{\n const result = [\n 'Mac OS X',\n ''\n ];\n if (match && match[1]) {\n const versionParts = [\n match[1],\n match[2],\n match[3] || '0'\n ];\n result[1] = versionParts.join('.');\n }\n return result;\n }\n ],\n [\n /Mac/i,\n [\n 'Mac OS X',\n ''\n ]\n ],\n [\n /CrOS/,\n [\n CHROME_OS,\n ''\n ]\n ],\n [\n /Linux|debian/i,\n [\n 'Linux',\n ''\n ]\n ]\n];\nconst detectOS = function(user_agent) {\n for(let i = 0; i < osMatchers.length; i++){\n const [rgex, resultOrFn] = osMatchers[i];\n const match = rgex.exec(user_agent);\n const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn);\n if (result) return result;\n }\n return [\n '',\n ''\n ];\n};\nconst detectDevice = function(user_agent) {\n if (NINTENDO_REGEX.test(user_agent)) return NINTENDO;\n if (PLAYSTATION_REGEX.test(user_agent)) return PLAYSTATION;\n if (XBOX_REGEX.test(user_agent)) return XBOX;\n if (new RegExp(OUYA, 'i').test(user_agent)) return OUYA;\n if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) return WINDOWS_PHONE;\n else if (/iPad/.test(user_agent)) return IPAD;\n else if (/iPod/.test(user_agent)) return 'iPod Touch';\n else if (/iPhone/.test(user_agent)) return 'iPhone';\n else if (/(watch)(?: ?os[,/]|\\d,\\d\\/)[\\d.]+/i.test(user_agent)) return APPLE_WATCH;\n else if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n else if (/(kobo)\\s(ereader|touch)/i.test(user_agent)) return 'Kobo';\n else if (new RegExp(NOKIA, 'i').test(user_agent)) return NOKIA;\n else if (/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i.test(user_agent) || /(kf[a-z]+)( bui|\\)).+silk\\//i.test(user_agent)) return 'Kindle Fire';\n else if (/(Android|ZTE)/i.test(user_agent)) if (!(!new RegExp(MOBILE).test(user_agent) || /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent))) return ANDROID;\n else {\n if (/pixel[\\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent) || /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) || /lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent)) return ANDROID;\n return ANDROID_TABLET;\n }\n else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) return GENERIC_MOBILE;\n else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) return GENERIC_TABLET;\n else return '';\n};\nconst detectDeviceType = function(user_agent, options) {\n const device = detectDevice(user_agent);\n if (device === IPAD || device === ANDROID_TABLET || 'Kobo' === device || 'Kindle Fire' === device || device === GENERIC_TABLET) return TABLET;\n if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) return 'Console';\n if (device === APPLE_WATCH) return 'Wearable';\n if (device) return MOBILE;\n if (options?.userAgentDataPlatform === 'Android' && (options?.maxTouchPoints ?? 0) > 0) {\n const shortSide = Math.min(options?.screenWidth ?? 0, options?.screenHeight ?? 0);\n const shortSideDp = shortSide / (options?.devicePixelRatio ?? 1);\n return shortSideDp >= 600 ? TABLET : MOBILE;\n }\n return 'Desktop';\n};\nexport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS };\n","export * from \"./bot-detection.mjs\";\nexport * from \"./bucketed-rate-limiter.mjs\";\nexport * from \"./number-utils.mjs\";\nexport * from \"./string-utils.mjs\";\nexport * from \"./type-utils.mjs\";\nexport * from \"./promise-queue.mjs\";\nexport * from \"./logger.mjs\";\nexport * from \"./user-agent-utils.mjs\";\nconst STRING_FORMAT = 'utf8';\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nfunction isValidUUID(value) {\n return 'string' == typeof value && UUID_REGEX.test(value);\n}\nfunction getEventUuid(uuid, generateUuid) {\n return isValidUUID(uuid) ? uuid : generateUuid();\n}\nfunction assert(truthyValue, message) {\n if (!truthyValue || 'string' != typeof truthyValue || isEmpty(truthyValue)) throw new Error(message);\n}\nfunction isEmpty(truthyValue) {\n if (0 === truthyValue.trim().length) return true;\n return false;\n}\nfunction removeTrailingSlash(url) {\n return url?.replace(/\\/+$/, '');\n}\nfunction stripUrlHash(url) {\n if (!url) return url;\n return url.split('#')[0];\n}\nasync function retriable(fn, props) {\n let lastError = null;\n for(let i = 0; i < props.retryCount + 1; i++){\n if (i > 0) await new Promise((r)=>setTimeout(r, props.retryDelay));\n try {\n const res = await fn();\n return res;\n } catch (e) {\n lastError = e;\n if (!props.retryCheck(e)) throw e;\n }\n }\n throw lastError;\n}\nfunction currentTimestamp() {\n return new Date().getTime();\n}\nfunction currentISOTime() {\n return new Date().toISOString();\n}\nfunction safeSetTimeout(fn, timeout) {\n const t = setTimeout(fn, timeout);\n t?.unref && t?.unref();\n return t;\n}\nconst isPromise = (obj)=>obj && 'function' == typeof obj.then;\nconst isError = (x)=>x instanceof Error;\nfunction getFetch() {\n return 'undefined' != typeof fetch ? fetch : void 0 !== globalThis.fetch ? globalThis.fetch : void 0;\n}\nfunction allSettled(promises) {\n return Promise.all(promises.map((p)=>(p ?? Promise.resolve()).then((value)=>({\n status: 'fulfilled',\n value\n }), (reason)=>({\n status: 'rejected',\n reason\n }))));\n}\nexport { STRING_FORMAT, UUID_REGEX, allSettled, assert, currentISOTime, currentTimestamp, getEventUuid, getFetch, isError, isPromise, isValidUUID, removeTrailingSlash, retriable, safeSetTimeout, stripUrlHash };\n","import { isArray, isBoolean, isNull, isNullish, isUndefined } from \"../utils/index.mjs\";\nconst OTLP_SEVERITY_MAP = {\n trace: {\n text: 'TRACE',\n number: 1\n },\n debug: {\n text: 'DEBUG',\n number: 5\n },\n info: {\n text: 'INFO',\n number: 9\n },\n warn: {\n text: 'WARN',\n number: 13\n },\n error: {\n text: 'ERROR',\n number: 17\n },\n fatal: {\n text: 'FATAL',\n number: 21\n }\n};\nconst DEFAULT_OTLP_SEVERITY = OTLP_SEVERITY_MAP.info;\nfunction getOtlpSeverityText(level) {\n return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).text;\n}\nfunction getOtlpSeverityNumber(level) {\n return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).number;\n}\nfunction toOtlpAnyValue(value) {\n if (isBoolean(value)) return {\n boolValue: value\n };\n if ('number' == typeof value) {\n if (!Number.isFinite(value)) return {\n stringValue: String(value)\n };\n if (Number.isInteger(value)) return {\n intValue: value\n };\n return {\n doubleValue: value\n };\n }\n if ('string' == typeof value) return {\n stringValue: value\n };\n if (isArray(value)) return {\n arrayValue: {\n values: value.map((v)=>toOtlpAnyValue(v))\n }\n };\n try {\n return {\n stringValue: JSON.stringify(value)\n };\n } catch {\n return {\n stringValue: String(value)\n };\n }\n}\nfunction toOtlpKeyValueList(attrs) {\n const result = [];\n for(const key in attrs){\n const value = attrs[key];\n if (!(isNull(value) || isUndefined(value))) result.push({\n key,\n value: toOtlpAnyValue(value)\n });\n }\n return result;\n}\nfunction timestampToUnixNano() {\n return String(Date.now()) + '000000';\n}\nfunction buildOtlpLogRecord(options, sdkContext) {\n const level = options.level || 'info';\n const { text: severityText, number: severityNumber } = OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY;\n const now = timestampToUnixNano();\n const autoAttributes = {};\n if (sdkContext.distinctId) autoAttributes.posthogDistinctId = sdkContext.distinctId;\n if (sdkContext.sessionId) autoAttributes.sessionId = sdkContext.sessionId;\n if (sdkContext.windowId) autoAttributes['window.id'] = sdkContext.windowId;\n if (!isNullish(sdkContext.sessionStartTimestamp)) autoAttributes.sessionStartTimestamp = String(sdkContext.sessionStartTimestamp);\n if (!isNullish(sdkContext.lastActivityTimestamp)) autoAttributes.lastActivityTimestamp = String(sdkContext.lastActivityTimestamp);\n if (sdkContext.currentUrl) autoAttributes['url.full'] = sdkContext.currentUrl;\n if (sdkContext.screenName) autoAttributes['screen.name'] = sdkContext.screenName;\n if (sdkContext.appState) autoAttributes['app.state'] = sdkContext.appState;\n if (sdkContext.activeFeatureFlags && sdkContext.activeFeatureFlags.length > 0) autoAttributes.feature_flags = sdkContext.activeFeatureFlags;\n const mergedAttributes = {\n ...autoAttributes,\n ...options.attributes || {}\n };\n const record = {\n timeUnixNano: now,\n observedTimeUnixNano: now,\n severityNumber,\n severityText,\n body: {\n stringValue: options.body\n },\n attributes: toOtlpKeyValueList(mergedAttributes)\n };\n if (options.trace_id) record.traceId = options.trace_id;\n if (options.span_id) record.spanId = options.span_id;\n if (!isUndefined(options.trace_flags)) record.flags = options.trace_flags;\n return record;\n}\nfunction buildResourceAttributes(config, sdkName, sdkVersion) {\n return {\n ...config.resourceAttributes,\n 'service.name': config.serviceName || 'unknown_service',\n ...config.environment && {\n 'deployment.environment': config.environment\n },\n ...config.serviceVersion && {\n 'service.version': config.serviceVersion\n },\n 'telemetry.sdk.name': sdkName,\n 'telemetry.sdk.version': sdkVersion\n };\n}\nfunction buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {\n return {\n resourceLogs: [\n {\n resource: {\n attributes: toOtlpKeyValueList(resourceAttributes)\n },\n scopeLogs: [\n {\n scope: {\n name: scopeName,\n version: scopeVersion\n },\n logRecords\n }\n ]\n }\n ]\n };\n}\nexport { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList };\n","import { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes } from \"./logs-utils.mjs\";\nimport { PostHogPersistedProperty } from \"../types.mjs\";\nimport { isArray, safeSetTimeout } from \"../utils/index.mjs\";\nconst MAX_FLUSH_BACKOFF_EXPONENT = 6;\nclass PostHogLogs {\n constructor(_instance, _config, _logger, _getContext, _onReady, _waitForStoragePersist = ()=>Promise.resolve(), _scopeName){\n this._instance = _instance;\n this._config = _config;\n this._logger = _logger;\n this._getContext = _getContext;\n this._onReady = _onReady;\n this._waitForStoragePersist = _waitForStoragePersist;\n this._scopeName = _scopeName;\n this._flushPromise = null;\n this._evictedSinceAdvance = 0;\n this._consecutiveFlushFailures = 0;\n this._intervalWindowStart = 0;\n this._intervalLogCount = 0;\n this._droppedWarned = false;\n this._maxBufferSize = _config.maxBufferSize;\n this._maxQueueSize = Math.max(_config.maxQueueSize ?? _config.maxBufferSize, _config.maxBufferSize);\n this._flushIntervalMs = _config.flushIntervalMs;\n this._maxBatchRecordsPerPost = _config.maxBatchRecordsPerPost;\n this._rateCapWindowMs = _config.rateCapWindowMs;\n this._maxLogsPerInterval = _config.maxLogsPerInterval;\n }\n reset() {\n this._clearFlushTimer();\n this._flushPromise = null;\n this._intervalWindowStart = 0;\n this._intervalLogCount = 0;\n this._droppedWarned = false;\n this._evictedSinceAdvance = 0;\n this._consecutiveFlushFailures = 0;\n this._maxBatchRecordsPerPost = this._config.maxBatchRecordsPerPost;\n }\n onReconnect() {\n this._consecutiveFlushFailures = 0;\n this._flushInBackground();\n }\n captureLog(options) {\n if (this._instance.isDisabled) return;\n if (this._instance.optedOut) return;\n if (!options?.body) return;\n const filtered = this._runBeforeSend(options);\n if (null === filtered) return;\n if (!filtered.body) return void this._logger.info(\"Log was rejected in beforeSend function\");\n if (!this._checkRateLimit()) return;\n const record = buildOtlpLogRecord(filtered, this._getContext());\n const entry = {\n record\n };\n this._onReady(()=>this._enqueue(entry));\n }\n _runBeforeSend(options) {\n const beforeSend = this._config.beforeSend;\n if (!beforeSend) return options;\n const fns = isArray(beforeSend) ? beforeSend : [\n beforeSend\n ];\n let result = options;\n for (const fn of fns)try {\n const next = fn(result);\n if (!next) {\n this._logger.info(\"Log was rejected in beforeSend function\");\n return null;\n }\n result = next;\n } catch (e) {\n this._logger.error(\"Error in beforeSend function for log:\", e);\n return null;\n }\n return result;\n }\n _checkRateLimit() {\n if (void 0 === this._maxLogsPerInterval) return true;\n const now = Date.now();\n const elapsed = now - this._intervalWindowStart;\n if (elapsed >= this._rateCapWindowMs || elapsed < 0) {\n this._intervalWindowStart = now;\n this._intervalLogCount = 0;\n this._droppedWarned = false;\n }\n if (this._intervalLogCount >= this._maxLogsPerInterval) {\n if (!this._droppedWarned) {\n this._logger.warn(`captureLog dropping logs: exceeded ${this._maxLogsPerInterval} logs per ${this._rateCapWindowMs}ms`);\n this._droppedWarned = true;\n }\n return false;\n }\n this._intervalLogCount++;\n return true;\n }\n async flush() {\n if (this._instance.isDisabled) return;\n if (this._flushPromise) return this._flushPromise;\n this._flushPromise = this._flushInner().finally(()=>{\n this._flushPromise = null;\n });\n return this._flushPromise;\n }\n async _flushInner() {\n this._clearFlushTimer();\n let queue = this._instance.getPersistedProperty(PostHogPersistedProperty.LogsQueue) ?? [];\n if (0 === queue.length) return;\n const originalQueueLength = queue.length;\n let sentCount = 0;\n while(queue.length > 0 && sentCount < originalQueueLength){\n this._evictedSinceAdvance = 0;\n const batchSize = Math.min(queue.length, this._maxBatchRecordsPerPost);\n const batch = queue.slice(0, batchSize);\n const records = batch.map((e)=>e.record);\n const payload = buildOtlpLogsPayload(records, this._buildResourceAttributes(), this._scopeName ?? this._instance.getLibraryId(), this._instance.getLibraryVersion());\n const outcome = await this._instance._sendLogsBatch(payload);\n if ('too-large' === outcome.kind && batch.length > 1) {\n this._maxBatchRecordsPerPost = Math.max(1, Math.floor(batch.length / 2));\n this._logger.warn(`Received 413 when sending logs batch of size ${batch.length}, reducing batch size to ${this._maxBatchRecordsPerPost}`);\n continue;\n }\n if ('retry-later' === outcome.kind) throw outcome.error;\n if ('too-large' === outcome.kind) this._logger.warn(\"Dropping a single log record after 413 with batch size 1 \\u2014 the record is larger than the server cap and cannot be split further.\");\n else if ('ok' === outcome.kind && this._maxBatchRecordsPerPost < this._config.maxBatchRecordsPerPost) this._maxBatchRecordsPerPost = Math.min(this._config.maxBatchRecordsPerPost, this._maxBatchRecordsPerPost + 1);\n await this._persistQueueAdvance(batch.length);\n queue = this._instance.getPersistedProperty(PostHogPersistedProperty.LogsQueue) ?? [];\n sentCount += batch.length;\n if ('fatal' === outcome.kind) throw outcome.error;\n }\n }\n async _persistQueueAdvance(consumed) {\n const evicted = this._evictedSinceAdvance;\n const drop = Math.max(0, consumed - evicted);\n const refreshed = this._instance.getPersistedProperty(PostHogPersistedProperty.LogsQueue) ?? [];\n this._instance.setPersistedProperty(PostHogPersistedProperty.LogsQueue, refreshed.slice(drop));\n await this._waitForStoragePersist();\n }\n _buildResourceAttributes() {\n return buildResourceAttributes(this._config, this._instance.getLibraryId(), this._instance.getLibraryVersion());\n }\n _enqueue(entry) {\n if (this._instance.optedOut) return;\n const queue = this._instance.getPersistedProperty(PostHogPersistedProperty.LogsQueue) ?? [];\n if (queue.length >= this._maxQueueSize) {\n queue.shift();\n this._evictedSinceAdvance++;\n this._logger.info('Logs queue is full, dropping oldest record.');\n }\n queue.push(entry);\n this._instance.setPersistedProperty(PostHogPersistedProperty.LogsQueue, queue);\n if (queue.length >= this._maxBufferSize) return void this._flushInBackground();\n this._armFlushTimer();\n }\n _armFlushTimer(delayMs = this._flushIntervalMs) {\n if (this._flushTimer) return;\n this._flushTimer = safeSetTimeout(()=>{\n this._flushTimer = void 0;\n this._flushInBackground();\n }, delayMs);\n }\n _nextFlushDelay() {\n const exponent = Math.min(Math.max(0, this._consecutiveFlushFailures - 1), MAX_FLUSH_BACKOFF_EXPONENT);\n return this._flushIntervalMs * 2 ** exponent;\n }\n _hasQueuedRecords() {\n const queue = this._instance.getPersistedProperty(PostHogPersistedProperty.LogsQueue);\n return !!queue && queue.length > 0;\n }\n async shutdown(timeoutMs) {\n this._clearFlushTimer();\n const flushPromise = this.flush().catch(()=>{});\n if (void 0 === timeoutMs) return void await flushPromise;\n await Promise.race([\n flushPromise,\n new Promise((resolve)=>safeSetTimeout(resolve, timeoutMs))\n ]);\n }\n async flushWithTimeout(timeoutMs) {\n let timedOut = false;\n const flushPromise = this.flush();\n const timerPromise = new Promise((resolve)=>safeSetTimeout(()=>{\n timedOut = true;\n resolve();\n }, timeoutMs));\n try {\n await Promise.race([\n flushPromise,\n timerPromise\n ]);\n } finally{\n if (timedOut) flushPromise.catch(()=>{});\n }\n }\n _flushInBackground() {\n this.flush().then(()=>{\n this._consecutiveFlushFailures = 0;\n }, (err)=>{\n this._consecutiveFlushFailures++;\n this._logger.error('PostHog logs flush failed:', err);\n }).finally(()=>{\n if (!this._instance.isDisabled && this._hasQueuedRecords()) this._armFlushTimer(this._nextFlushDelay());\n });\n }\n _clearFlushTimer() {\n if (this._flushTimer) {\n clearTimeout(this._flushTimer);\n this._flushTimer = void 0;\n }\n }\n}\nexport { PostHogLogs };\n","import { toOtlpKeyValueList } from \"../logs/logs-utils.mjs\";\nconst DEFAULT_HISTOGRAM_BOUNDS = [\n 0,\n 5,\n 10,\n 25,\n 50,\n 75,\n 100,\n 250,\n 500,\n 750,\n 1000,\n 2500,\n 5000,\n 7500,\n 10000\n];\nfunction msToUnixNano(ms) {\n return String(ms) + '000000';\n}\nfunction seriesKey(type, name, unit, attributes) {\n let attrsKey = '';\n if (attributes) {\n const keys = Object.keys(attributes).sort();\n attrsKey = keys.map((k)=>`${JSON.stringify(k)}:${JSON.stringify(attributes[k])}`).join(',');\n }\n return `${type}\\u0000${name}\\u0000${unit ?? ''}\\u0000${attrsKey}`;\n}\nfunction bucketIndexFor(value, bounds) {\n for(let i = 0; i < bounds.length; i++)if (value <= bounds[i]) return i;\n return bounds.length;\n}\nfunction buildMetricsResourceAttributes(config, scopeName, scopeVersion) {\n return {\n ...config.resourceAttributes,\n 'service.name': config.serviceName || 'unknown_service',\n ...config.environment && {\n 'deployment.environment': config.environment\n },\n ...config.serviceVersion && {\n 'service.version': config.serviceVersion\n },\n 'telemetry.sdk.name': scopeName,\n 'telemetry.sdk.version': scopeVersion\n };\n}\nfunction buildOtlpMetricsPayload(metrics, resourceAttributes, scopeName, scopeVersion) {\n return {\n resourceMetrics: [\n {\n resource: {\n attributes: toOtlpKeyValueList(resourceAttributes)\n },\n scopeMetrics: [\n {\n scope: {\n name: scopeName,\n version: scopeVersion\n },\n metrics\n }\n ]\n }\n ]\n };\n}\nexport { DEFAULT_HISTOGRAM_BOUNDS, bucketIndexFor, buildMetricsResourceAttributes, buildOtlpMetricsPayload, msToUnixNano, seriesKey };\n","import { isArray, safeSetTimeout } from \"../utils/index.mjs\";\nimport { toOtlpKeyValueList } from \"../logs/logs-utils.mjs\";\nimport { DEFAULT_HISTOGRAM_BOUNDS, bucketIndexFor, buildMetricsResourceAttributes, buildOtlpMetricsPayload, msToUnixNano, seriesKey } from \"./metrics-utils.mjs\";\nimport { resolveMetricsConfig } from \"./config.mjs\";\nconst OTLP_TEMPORALITY_DELTA = 1;\nclass PostHogMetrics {\n constructor(_instance, _config, _logger){\n this._instance = _instance;\n this._config = _config;\n this._logger = _logger;\n this._series = new Map();\n this._flushPromise = null;\n this._seriesCapWarned = false;\n this._typeByName = new Map();\n this._typeCollisionWarned = new Set();\n this._generation = 0;\n }\n count(name, value = 1, options) {\n this._capture({\n name,\n type: 'count',\n value,\n unit: options?.unit,\n attributes: options?.attributes\n });\n }\n gauge(name, value, options) {\n this._capture({\n name,\n type: 'gauge',\n value,\n unit: options?.unit,\n attributes: options?.attributes\n });\n }\n histogram(name, value, options) {\n this._capture({\n name,\n type: 'histogram',\n value,\n unit: options?.unit,\n attributes: options?.attributes\n });\n }\n flush() {\n const prev = this._flushPromise;\n const run = async ()=>{\n if (prev) await prev.catch(()=>{});\n await this._doFlush();\n };\n const p = run().finally(()=>{\n if (this._flushPromise === p) this._flushPromise = null;\n });\n this._flushPromise = p;\n return p;\n }\n drainWindow() {\n if (0 === this._series.size) return null;\n const window = this._series;\n this._series = new Map();\n this._seriesCapWarned = false;\n this._typeByName = new Map();\n this._typeCollisionWarned = new Set();\n return this._buildPayload(window);\n }\n reset() {\n this._generation++;\n this._clearFlushTimer();\n this._series = new Map();\n this._flushPromise = null;\n this._seriesCapWarned = false;\n this._typeByName = new Map();\n this._typeCollisionWarned = new Set();\n }\n _capture(sample) {\n if (this._instance.isDisabled || this._instance.optedOut) return;\n const filtered = this._runBeforeSend(sample);\n if (null === filtered) return;\n if (!filtered.name || 'string' != typeof filtered.name) return void this._logger.warn('Dropping metric with empty name');\n if ('number' != typeof filtered.value || !Number.isFinite(filtered.value)) return void this._logger.warn(`Dropping metric '${filtered.name}': value must be a finite number`);\n if ('count' === filtered.type && filtered.value < 0) return void this._logger.warn(`Dropping count '${filtered.name}': counters are monotonic, value must be >= 0`);\n let attributes;\n let key;\n try {\n attributes = filtered.attributes ? {\n ...filtered.attributes\n } : void 0;\n key = seriesKey(filtered.type, filtered.name, filtered.unit, attributes);\n } catch (e) {\n this._logger.warn(`Dropping metric '${filtered.name}': attributes could not be serialized`, e);\n return;\n }\n let state = this._series.get(key);\n if (!state) {\n if (!this._admitNewSeries()) return;\n state = {\n name: filtered.name,\n type: filtered.type,\n unit: filtered.unit,\n attributes,\n windowStartMs: Date.now()\n };\n this._series.set(key, state);\n }\n const seenType = this._typeByName.get(filtered.name);\n if (void 0 === seenType) this._typeByName.set(filtered.name, filtered.type);\n else if (seenType !== filtered.type && !this._typeCollisionWarned.has(filtered.name)) {\n this._typeCollisionWarned.add(filtered.name);\n this._logger.warn(`Metric name '${filtered.name}' is already used as a ${seenType}; recording it as a ${filtered.type} too will blend both series in charts. Use a distinct name.`);\n }\n this._fold(state, filtered.value);\n this._armFlushTimer();\n }\n _admitNewSeries() {\n if (this._series.size < this._config.maxSeriesPerFlush) return true;\n if (!this._seriesCapWarned) {\n this._seriesCapWarned = true;\n this._logger.warn(`Metric series cap reached (${this._config.maxSeriesPerFlush} per flush window); dropping new series until the next flush. Reduce attribute cardinality.`);\n }\n return false;\n }\n _fold(state, value) {\n switch(state.type){\n case 'count':\n state.total = (state.total ?? 0) + value;\n break;\n case 'gauge':\n state.last = value;\n break;\n case 'histogram':\n {\n if (!state.hist) state.hist = {\n count: 0,\n sum: 0,\n min: value,\n max: value,\n bucketCounts: new Array(DEFAULT_HISTOGRAM_BOUNDS.length + 1).fill(0)\n };\n const hist = state.hist;\n hist.count += 1;\n hist.sum += value;\n hist.min = Math.min(hist.min, value);\n hist.max = Math.max(hist.max, value);\n hist.bucketCounts[bucketIndexFor(value, DEFAULT_HISTOGRAM_BOUNDS)] += 1;\n break;\n }\n }\n }\n _runBeforeSend(sample) {\n const beforeSend = this._config.beforeSend;\n if (!beforeSend) return sample;\n const fns = isArray(beforeSend) ? beforeSend : [\n beforeSend\n ];\n let result = sample;\n for (const fn of fns)try {\n const next = fn(result);\n if (!next) {\n this._logger.info(\"Metric was rejected in beforeSend function\");\n return null;\n }\n result = next;\n } catch (e) {\n this._logger.error(\"Error in beforeSend function for metric:\", e);\n return null;\n }\n return result;\n }\n _armFlushTimer() {\n if (this._flushTimer) return;\n this._flushTimer = safeSetTimeout(()=>{\n this._flushTimer = void 0;\n this.flush().catch((e)=>{\n this._logger.error('Metrics flush failed:', e);\n });\n }, this._config.flushIntervalMs);\n }\n _clearFlushTimer() {\n if (this._flushTimer) {\n clearTimeout(this._flushTimer);\n this._flushTimer = void 0;\n }\n }\n async _doFlush() {\n if (0 === this._series.size) return;\n const window = this._series;\n this._series = new Map();\n this._seriesCapWarned = false;\n this._typeByName = new Map();\n this._typeCollisionWarned = new Set();\n const generation = this._generation;\n const outcome = await this._instance._sendMetricsBatch(this._buildPayload(window));\n if (generation !== this._generation) return;\n switch(outcome.kind){\n case 'ok':\n return;\n case 'retry-later':\n this._mergeWindowBack(window);\n this._armFlushTimer();\n return;\n case 'too-large':\n this._logger.warn('Metrics batch exceeded the server size limit and was dropped');\n return;\n case 'fatal':\n this._logger.error('Failed to send metrics batch:', outcome.error);\n return;\n }\n }\n _buildPayload(window) {\n return buildOtlpMetricsPayload(this._buildMetrics(window), buildMetricsResourceAttributes(this._config, this._instance.getLibraryId(), this._instance.getLibraryVersion()), this._instance.getLibraryId(), this._instance.getLibraryVersion());\n }\n _buildMetrics(window) {\n const nowNano = msToUnixNano(Date.now());\n const byMetric = new Map();\n for (const state of window.values()){\n const metricKey = seriesKey(state.type, state.name, state.unit, void 0);\n let metric = byMetric.get(metricKey);\n if (!metric) {\n metric = {\n name: state.name,\n ...state.unit && {\n unit: state.unit\n }\n };\n if ('count' === state.type) metric.sum = {\n aggregationTemporality: OTLP_TEMPORALITY_DELTA,\n isMonotonic: true,\n dataPoints: []\n };\n else if ('gauge' === state.type) metric.gauge = {\n dataPoints: []\n };\n else metric.histogram = {\n aggregationTemporality: OTLP_TEMPORALITY_DELTA,\n dataPoints: []\n };\n byMetric.set(metricKey, metric);\n }\n const attributes = toOtlpKeyValueList(state.attributes ?? {});\n const startNano = msToUnixNano(state.windowStartMs);\n if ('count' === state.type) {\n const dp = {\n attributes,\n startTimeUnixNano: startNano,\n timeUnixNano: nowNano,\n asDouble: state.total ?? 0\n };\n metric.sum.dataPoints.push(dp);\n } else if ('gauge' === state.type) {\n const dp = {\n attributes,\n timeUnixNano: nowNano,\n asDouble: state.last ?? 0\n };\n metric.gauge.dataPoints.push(dp);\n } else if (state.hist) {\n const dp = {\n attributes,\n startTimeUnixNano: startNano,\n timeUnixNano: nowNano,\n count: state.hist.count,\n sum: state.hist.sum,\n min: state.hist.min,\n max: state.hist.max,\n bucketCounts: state.hist.bucketCounts,\n explicitBounds: DEFAULT_HISTOGRAM_BOUNDS\n };\n metric.histogram.dataPoints.push(dp);\n }\n }\n return Array.from(byMetric.values());\n }\n _mergeWindowBack(window) {\n for (const [key, old] of window){\n const current = this._series.get(key);\n if (!current) {\n if (this._admitNewSeries()) this._series.set(key, old);\n continue;\n }\n current.windowStartMs = Math.min(current.windowStartMs, old.windowStartMs);\n switch(current.type){\n case 'count':\n current.total = (current.total ?? 0) + (old.total ?? 0);\n break;\n case 'gauge':\n break;\n case 'histogram':\n if (old.hist) if (current.hist) {\n current.hist.count += old.hist.count;\n current.hist.sum += old.hist.sum;\n current.hist.min = Math.min(current.hist.min, old.hist.min);\n current.hist.max = Math.max(current.hist.max, old.hist.max);\n for(let i = 0; i < current.hist.bucketCounts.length; i++)current.hist.bucketCounts[i] += old.hist.bucketCounts[i];\n } else current.hist = old.hist;\n break;\n }\n }\n }\n}\nexport { DEFAULT_HISTOGRAM_BOUNDS, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpMetricsPayload, resolveMetricsConfig };\n","let parsedStackResults;\nlet lastKeysCount;\nlet cachedFilenameChunkIds;\nfunction getFilenameToChunkIdMap(stackParser) {\n const chunkIdMap = globalThis._posthogChunkIds;\n if (!chunkIdMap) return;\n const chunkIdKeys = Object.keys(chunkIdMap);\n if (cachedFilenameChunkIds && chunkIdKeys.length === lastKeysCount) return cachedFilenameChunkIds;\n lastKeysCount = chunkIdKeys.length;\n cachedFilenameChunkIds = chunkIdKeys.reduce((acc, stackKey)=>{\n if (!parsedStackResults) parsedStackResults = {};\n const result = parsedStackResults[stackKey];\n if (result) acc[result[0]] = result[1];\n else {\n const parsedStack = stackParser(stackKey);\n for(let i = parsedStack.length - 1; i >= 0; i--){\n const stackFrame = parsedStack[i];\n const filename = stackFrame?.filename;\n const chunkId = chunkIdMap[stackKey];\n if (filename && chunkId) {\n acc[filename] = chunkId;\n parsedStackResults[stackKey] = [\n filename,\n chunkId\n ];\n break;\n }\n }\n }\n return acc;\n }, {});\n return cachedFilenameChunkIds;\n}\nexport { getFilenameToChunkIdMap };\n","import { isArray } from \"../utils/index.mjs\";\nimport { getFilenameToChunkIdMap } from \"./chunk-ids.mjs\";\nconst MAX_CAUSE_RECURSION = 4;\nclass ErrorPropertiesBuilder {\n constructor(coercers, stackParser, modifiers = []){\n this.coercers = coercers;\n this.stackParser = stackParser;\n this.modifiers = modifiers;\n }\n buildFromUnknown(input, hint = {}) {\n const providedMechanism = hint && hint.mechanism;\n const mechanism = providedMechanism || {\n handled: true,\n type: 'generic'\n };\n const coercingContext = this.buildCoercingContext(mechanism, hint, 0);\n const exceptionWithCause = coercingContext.apply(input);\n const parsingContext = this.buildParsingContext(hint);\n const exceptionWithStack = this.parseStacktrace(exceptionWithCause, parsingContext);\n const exceptionList = this.convertToExceptionList(exceptionWithStack, mechanism);\n return {\n $exception_list: exceptionList,\n $exception_level: 'error'\n };\n }\n async modifyFrames(exceptionList) {\n for (const exc of exceptionList)if (exc.stacktrace && exc.stacktrace.frames && isArray(exc.stacktrace.frames)) exc.stacktrace.frames = await this.applyModifiers(exc.stacktrace.frames);\n return exceptionList;\n }\n coerceFallback(ctx) {\n return {\n type: 'Error',\n value: 'Unknown error',\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n parseStacktrace(err, ctx) {\n let cause;\n if (null != err.cause) cause = this.parseStacktrace(err.cause, ctx);\n let stack;\n if ('' != err.stack && null != err.stack) stack = this.applyChunkIds(this.stackParser(err.stack, err.synthetic ? ctx.skipFirstLines : 0), ctx.chunkIdMap);\n return {\n ...err,\n cause,\n stack\n };\n }\n applyChunkIds(frames, chunkIdMap) {\n return frames.map((frame)=>{\n if (frame.filename && chunkIdMap) frame.chunk_id = chunkIdMap[frame.filename];\n return frame;\n });\n }\n applyCoercers(input, ctx) {\n for (const adapter of this.coercers)if (adapter.match(input)) return adapter.coerce(input, ctx);\n return this.coerceFallback(ctx);\n }\n async applyModifiers(frames) {\n let newFrames = frames;\n for (const modifier of this.modifiers)newFrames = await modifier(newFrames);\n return newFrames;\n }\n convertToExceptionList(exceptionWithStack, mechanism) {\n const currentException = {\n type: exceptionWithStack.type,\n value: exceptionWithStack.value,\n mechanism: {\n type: mechanism.type ?? 'generic',\n handled: mechanism.handled ?? true,\n synthetic: exceptionWithStack.synthetic ?? false\n }\n };\n if (exceptionWithStack.stack) currentException.stacktrace = {\n type: 'raw',\n frames: exceptionWithStack.stack\n };\n const exceptionList = [\n currentException\n ];\n if (null != exceptionWithStack.cause) exceptionList.push(...this.convertToExceptionList(exceptionWithStack.cause, {\n ...mechanism,\n handled: true\n }));\n return exceptionList;\n }\n buildParsingContext(hint) {\n const context = {\n chunkIdMap: getFilenameToChunkIdMap(this.stackParser),\n skipFirstLines: hint.skipFirstLines ?? 1\n };\n return context;\n }\n buildCoercingContext(mechanism, hint, depth = 0) {\n const coerce = (input, depth)=>{\n if (!(depth <= MAX_CAUSE_RECURSION)) return;\n {\n const ctx = this.buildCoercingContext(mechanism, hint, depth);\n return this.applyCoercers(input, ctx);\n }\n };\n const context = {\n ...hint,\n syntheticException: 0 == depth ? hint.syntheticException : void 0,\n mechanism,\n apply: (input)=>coerce(input, depth),\n next: (input)=>coerce(input, depth + 1)\n };\n return context;\n }\n}\nexport { ErrorPropertiesBuilder };\n","import { isUndefined } from \"../../utils/index.mjs\";\nconst UNKNOWN_FUNCTION = '?';\nfunction createFrame(platform, filename, func, lineno, colno) {\n const frame = {\n platform,\n filename,\n function: '<anonymous>' === func ? UNKNOWN_FUNCTION : func,\n in_app: true\n };\n if (!isUndefined(lineno)) frame.lineno = lineno;\n if (!isUndefined(colno)) frame.colno = colno;\n return frame;\n}\nexport { UNKNOWN_FUNCTION, createFrame };\n","import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nconst extractSafariExtensionDetails = (func, filename)=>{\n const isSafariExtension = -1 !== func.indexOf('safari-extension');\n const isSafariWebExtension = -1 !== func.indexOf('safari-web-extension');\n return isSafariExtension || isSafariWebExtension ? [\n -1 !== func.indexOf('@') ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`\n ] : [\n func,\n filename\n ];\n};\nexport { extractSafariExtensionDetails };\n","import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\nconst chromeRegex = /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\nconst chromeStackLineParser = (line, platform)=>{\n const noFnParts = chromeRegexNoFnName.exec(line);\n if (noFnParts) {\n const [, filename, line, col] = noFnParts;\n return createFrame(platform, filename, UNKNOWN_FUNCTION, +line, +col);\n }\n const parts = chromeRegex.exec(line);\n if (parts) {\n const isEval = parts[2] && 0 === parts[2].indexOf('eval');\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n if (subMatch) {\n parts[2] = subMatch[1];\n parts[3] = subMatch[2];\n parts[4] = subMatch[3];\n }\n }\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n return createFrame(platform, filename, func, parts[3] ? +parts[3] : void 0, parts[4] ? +parts[4] : void 0);\n }\n};\nexport { chromeStackLineParser };\n","import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst geckoREgex = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nconst geckoStackLineParser = (line, platform)=>{\n const parts = geckoREgex.exec(line);\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n if (subMatch) {\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = '';\n }\n }\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n return createFrame(platform, filename, func, parts[4] ? +parts[4] : void 0, parts[5] ? +parts[5] : void 0);\n }\n};\nexport { geckoStackLineParser };\n","import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nimport { chromeStackLineParser } from \"./chrome.mjs\";\nimport { geckoStackLineParser } from \"./gecko.mjs\";\nimport { winjsStackLineParser } from \"./winjs.mjs\";\nimport { opera10StackLineParser, opera11StackLineParser } from \"./opera.mjs\";\nimport { nodeStackLineParser } from \"./node.mjs\";\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STACKTRACE_FRAME_LIMIT = 50;\nfunction reverseAndStripFrames(stack) {\n if (!stack.length) return [];\n const localStack = Array.from(stack);\n localStack.reverse();\n return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map((frame)=>({\n ...frame,\n filename: frame.filename || getLastStackFrame(localStack).filename,\n function: frame.function || UNKNOWN_FUNCTION\n }));\n}\nfunction getLastStackFrame(arr) {\n return arr[arr.length - 1] || {};\n}\nfunction createDefaultStackParser() {\n return createStackParser(\"web:javascript\", chromeStackLineParser, geckoStackLineParser);\n}\nfunction createStackParser(platform, ...parsers) {\n return (stack, skipFirstLines = 0)=>{\n const frames = [];\n const lines = stack.split('\\n');\n for(let i = skipFirstLines; i < lines.length; i++){\n const line = lines[i];\n if (line.length > 1024) continue;\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n if (!cleanedLine.match(/\\S*Error: /)) {\n for (const parser of parsers){\n const frame = parser(cleanedLine, platform);\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n if (frames.length >= STACKTRACE_FRAME_LIMIT) break;\n }\n }\n return reverseAndStripFrames(frames);\n };\n}\nexport { chromeStackLineParser, createDefaultStackParser, createStackParser, geckoStackLineParser, nodeStackLineParser, opera10StackLineParser, opera11StackLineParser, reverseAndStripFrames, winjsStackLineParser };\n","import { isBuiltin, isString } from \"../../utils/index.mjs\";\nclass DOMExceptionCoercer {\n match(err) {\n return this.isDOMException(err) || this.isDOMError(err);\n }\n coerce(err, ctx) {\n const hasStack = isString(err.stack);\n return {\n type: this.getType(err),\n value: this.getValue(err),\n stack: hasStack ? err.stack : void 0,\n cause: err.cause ? ctx.next(err.cause) : void 0,\n synthetic: false\n };\n }\n getType(candidate) {\n return this.isDOMError(candidate) ? 'DOMError' : 'DOMException';\n }\n getValue(err) {\n const name = err.name || (this.isDOMError(err) ? 'DOMError' : 'DOMException');\n const message = err.message ? `${name}: ${err.message}` : name;\n return message;\n }\n isDOMException(err) {\n return isBuiltin(err, 'DOMException');\n }\n isDOMError(err) {\n return isBuiltin(err, 'DOMError');\n }\n}\nexport { DOMExceptionCoercer };\n","import { isPlainError } from \"../../utils/index.mjs\";\nclass ErrorCoercer {\n match(err) {\n return isPlainError(err);\n }\n coerce(err, ctx) {\n return {\n type: this.getType(err),\n value: this.getMessage(err, ctx),\n stack: this.getStack(err),\n cause: err.cause ? ctx.next(err.cause) : void 0,\n synthetic: false\n };\n }\n getType(err) {\n return err.name || err.constructor.name;\n }\n getMessage(err, _ctx) {\n const message = err.message;\n if (message.error && 'string' == typeof message.error.message) return String(message.error.message);\n return String(message);\n }\n getStack(err) {\n return err.stacktrace || err.stack || void 0;\n }\n}\nexport { ErrorCoercer };\n","import { isErrorEvent } from \"../../utils/index.mjs\";\nclass ErrorEventCoercer {\n constructor(){}\n match(err) {\n return isErrorEvent(err) && void 0 != err.error;\n }\n coerce(err, ctx) {\n const exceptionLike = ctx.apply(err.error);\n if (!exceptionLike) return {\n type: 'ErrorEvent',\n value: err.message,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n return exceptionLike;\n }\n}\nexport { ErrorEventCoercer };\n","const ERROR_TYPES_PATTERN = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\nclass StringCoercer {\n match(input) {\n return 'string' == typeof input;\n }\n coerce(input, ctx) {\n const [type, value] = this.getInfos(input);\n return {\n type: type ?? 'Error',\n value: value ?? input,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n getInfos(candidate) {\n let type = 'Error';\n let value = candidate;\n const groups = candidate.match(ERROR_TYPES_PATTERN);\n if (groups) {\n type = groups[1];\n value = groups[2];\n }\n return [\n type,\n value\n ];\n }\n}\nexport { StringCoercer };\n","const severityLevels = [\n 'fatal',\n 'error',\n 'warning',\n 'log',\n 'info',\n 'debug'\n];\nexport { severityLevels };\n","function truncate(str, max = 0) {\n if ('string' != typeof str || 0 === max) return str;\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nfunction extractExceptionKeysForMessage(err, maxLength = 40) {\n const keys = Object.keys(err);\n keys.sort();\n if (!keys.length) return '[object has no keys]';\n for(let i = keys.length; i > 0; i--){\n const serialized = keys.slice(0, i).join(', ');\n if (!(serialized.length > maxLength)) {\n if (i === keys.length) return serialized;\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`;\n }\n }\n return '';\n}\nexport { extractExceptionKeysForMessage, truncate };\n","import { isEmptyString, isError, isEvent, isString } from \"../../utils/index.mjs\";\nimport { severityLevels } from \"../types.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass ObjectCoercer {\n match(candidate) {\n return 'object' == typeof candidate && null !== candidate;\n }\n coerce(candidate, ctx) {\n const errorProperty = this.getErrorPropertyFromObject(candidate);\n if (errorProperty) return ctx.apply(errorProperty);\n return {\n type: this.getType(candidate),\n value: this.getValue(candidate),\n stack: ctx.syntheticException?.stack,\n level: this.isSeverityLevel(candidate.level) ? candidate.level : 'error',\n synthetic: true\n };\n }\n getType(err) {\n return isEvent(err) ? err.constructor.name : 'Error';\n }\n getValue(err) {\n if ('name' in err && 'string' == typeof err.name) {\n let message = `'${err.name}' captured as exception`;\n if ('message' in err && 'string' == typeof err.message) message += ` with message: '${err.message}'`;\n return message;\n }\n if ('message' in err && 'string' == typeof err.message) return err.message;\n const className = this.getObjectClassName(err);\n const keys = extractExceptionKeysForMessage(err);\n return `${className && 'Object' !== className ? `'${className}'` : 'Object'} captured as exception with keys: ${keys}`;\n }\n isSeverityLevel(x) {\n return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x) >= 0;\n }\n getErrorPropertyFromObject(obj) {\n for(const prop in obj)if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n const value = obj[prop];\n if (isError(value)) return value;\n }\n }\n getObjectClassName(obj) {\n try {\n const prototype = Object.getPrototypeOf(obj);\n return prototype ? prototype.constructor.name : void 0;\n } catch (e) {\n return;\n }\n }\n}\nexport { ObjectCoercer };\n","import { isEvent } from \"../../utils/index.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass EventCoercer {\n match(err) {\n return isEvent(err);\n }\n coerce(evt, ctx) {\n const constructorName = evt.constructor.name;\n return {\n type: constructorName,\n value: `${constructorName} captured as exception with keys: ${extractExceptionKeysForMessage(evt)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n}\nexport { EventCoercer };\n","import { isPrimitive } from \"../../utils/index.mjs\";\nclass PrimitiveCoercer {\n match(candidate) {\n return isPrimitive(candidate);\n }\n coerce(value, ctx) {\n return {\n type: 'Error',\n value: `Primitive value captured as exception: ${String(value)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n }\n}\nexport { PrimitiveCoercer };\n","import { isBuiltin, isEvent, isPrimitive } from \"../../utils/index.mjs\";\nclass PromiseRejectionEventCoercer {\n match(err) {\n return isBuiltin(err, 'PromiseRejectionEvent') || this.isCustomEventWrappingRejection(err);\n }\n isCustomEventWrappingRejection(err) {\n if (!isEvent(err)) return false;\n try {\n const detail = err.detail;\n return null != detail && 'object' == typeof detail && 'reason' in detail;\n } catch {\n return false;\n }\n }\n coerce(err, ctx) {\n const reason = this.getUnhandledRejectionReason(err);\n if (isPrimitive(reason)) return {\n type: 'UnhandledRejection',\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n stack: ctx.syntheticException?.stack,\n synthetic: true\n };\n return ctx.apply(reason);\n }\n getUnhandledRejectionReason(error) {\n try {\n if ('reason' in error) return error.reason;\n if ('detail' in error && null != error.detail && 'object' == typeof error.detail && 'reason' in error.detail) return error.detail.reason;\n } catch {}\n return error;\n }\n}\nexport { PromiseRejectionEventCoercer };\n","import { isNumber, isObject, isString, safeJsonStringify } from \"../utils/index.mjs\";\nconst EXCEPTION_STEP_INTERNAL_FIELDS = {\n MESSAGE: '$message',\n TIMESTAMP: '$timestamp'\n};\nconst RESERVED_EXCEPTION_STEP_KEYS = new Set([\n EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE,\n EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP\n]);\nconst DEFAULT_EXCEPTION_STEPS_CONFIG = {\n enabled: true,\n max_bytes: 32768\n};\nfunction resolveExceptionStepsConfig(config) {\n if (!config) return {\n ...DEFAULT_EXCEPTION_STEPS_CONFIG\n };\n return {\n enabled: config.enabled ?? DEFAULT_EXCEPTION_STEPS_CONFIG.enabled,\n max_bytes: normalizePositiveInteger(config.max_bytes, DEFAULT_EXCEPTION_STEPS_CONFIG.max_bytes)\n };\n}\nfunction stripReservedExceptionStepFields(properties) {\n if (!properties) return {\n sanitizedProperties: {},\n droppedKeys: []\n };\n const droppedKeys = [];\n const sanitizedProperties = Object.keys(properties).reduce((acc, key)=>{\n if (RESERVED_EXCEPTION_STEP_KEYS.has(key)) {\n droppedKeys.push(key);\n return acc;\n }\n acc[key] = properties[key];\n return acc;\n }, {});\n return {\n sanitizedProperties,\n droppedKeys\n };\n}\nclass ExceptionStepsBuffer {\n constructor(config){\n this._entries = [];\n this._totalBytes = 0;\n this._config = resolveExceptionStepsConfig(config);\n }\n setConfig(config) {\n this._config = resolveExceptionStepsConfig(config);\n this._trimToMaxBytes();\n }\n add(step) {\n const serialized = normalizeAndSerializeStep(step);\n if (!serialized) return;\n const bytes = getUtf8ByteLength(serialized.json);\n if (bytes > this._config.max_bytes) return;\n this._entries.push({\n step: serialized.step,\n bytes\n });\n this._totalBytes += bytes;\n this._trimToMaxBytes();\n }\n getAttachable() {\n return this._entries.map((e)=>e.step);\n }\n clear() {\n this._entries = [];\n this._totalBytes = 0;\n }\n size() {\n return this._entries.length;\n }\n _trimToMaxBytes() {\n while(this._totalBytes > this._config.max_bytes && this._entries.length > 0){\n const evicted = this._entries.shift();\n if (evicted) this._totalBytes -= evicted.bytes;\n }\n }\n}\nfunction normalizePositiveInteger(input, fallback) {\n if (!isNumber(input) || input === 1 / 0 || input === -1 / 0) return fallback;\n const normalized = Math.floor(input);\n if (normalized < 0) return fallback;\n return normalized;\n}\nfunction normalizeAndSerializeStep(step) {\n let json;\n try {\n json = safeJsonStringify(step);\n } catch {\n return;\n }\n try {\n const parsed = JSON.parse(json);\n if (!isObject(parsed)) return;\n const parsedStep = parsed;\n const message = parsedStep[EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE];\n const timestamp = parsedStep[EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP];\n if (!isString(message) || 0 === message.trim().length) return;\n if (!isString(timestamp) && !isNumber(timestamp)) return;\n return {\n step: parsedStep,\n json\n };\n } catch {\n return;\n }\n}\nfunction getUtf8ByteLength(value) {\n if ('undefined' != typeof TextEncoder) return new TextEncoder().encode(value).length;\n const encoded = encodeURIComponent(value);\n let byteLength = 0;\n for(let i = 0; i < encoded.length; i++)if ('%' === encoded[i]) {\n byteLength += 1;\n i += 2;\n } else byteLength += 1;\n return byteLength;\n}\nexport { DEFAULT_EXCEPTION_STEPS_CONFIG, EXCEPTION_STEP_INTERNAL_FIELDS, ExceptionStepsBuffer, getUtf8ByteLength, resolveExceptionStepsConfig, stripReservedExceptionStepFields };\n","import config from \"../config.mjs\";\nimport { isUndefined } from \"@posthog/core\";\nimport { window as external_globals_mjs_window } from \"./globals.mjs\";\nconst _createLogger = (prefix, { debugEnabled } = {})=>{\n const logger = {\n _log: (level, ...args)=>{\n if (external_globals_mjs_window && (config.DEBUG || external_globals_mjs_window.POSTHOG_DEBUG || debugEnabled) && !isUndefined(external_globals_mjs_window.console) && external_globals_mjs_window.console) {\n const consoleLog = '__rrweb_original__' in external_globals_mjs_window.console[level] ? external_globals_mjs_window.console[level]['__rrweb_original__'] : external_globals_mjs_window.console[level];\n consoleLog(prefix, ...args);\n }\n },\n debug: (...args)=>{\n logger._log('debug', ...args);\n },\n info: (...args)=>{\n logger._log('log', ...args);\n },\n warn: (...args)=>{\n logger._log('warn', ...args);\n },\n error: (...args)=>{\n logger._log('error', ...args);\n },\n critical: (...args)=>{\n console.error(prefix, ...args);\n },\n uninitializedWarning: (methodName)=>{\n logger.error(`You must initialize PostHog before calling ${methodName}`);\n },\n createLogger: (additionalPrefix, options)=>_createLogger(`${prefix} ${additionalPrefix}`, options)\n };\n return logger;\n};\nconst logger_logger = _createLogger('[PostHog.js]');\nconst createLogger = logger_logger.createLogger;\nexport { createLogger, logger_logger as logger };\n","import type { PostHog } from '../posthog-core'\nimport { document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow, PostHogExtensionKind } from '../utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nconst logger = createLogger('[ExternalScriptsLoader]')\n\nconst loadScript = (posthog: PostHog, url: string, callback: (error?: string | Event, event?: Event) => void) => {\n if (posthog.config.disable_external_dependency_loading) {\n logger.warn(`${url} was requested but loading of external scripts is disabled.`)\n return callback('Loading of external scripts is disabled')\n }\n\n // If we add a script more than once then the browser will parse and execute it\n // So, even if idempotent we waste parsing and processing time\n const existingScripts = document?.querySelectorAll('script')\n if (existingScripts) {\n for (let i = 0; i < existingScripts.length; i++) {\n if (existingScripts[i].src === url) {\n const alreadyExistingScriptTag = existingScripts[i]\n\n if ((alreadyExistingScriptTag as any).__posthog_loading_callback_fired) {\n // script already exists and fired its load event,\n // we call the callback again, they need to be idempotent\n return callback()\n }\n\n // eslint-disable-next-line posthog-js/no-add-event-listener\n alreadyExistingScriptTag.addEventListener('load', (event) => {\n // it hasn't already loaded\n // we probably called loadScript twice in quick succession,\n // so we attach a callback to the onload event\n ;(alreadyExistingScriptTag as any).__posthog_loading_callback_fired = true\n callback(undefined, event)\n })\n alreadyExistingScriptTag.onerror = (error) => callback(error)\n\n return // and finish processing here\n }\n }\n }\n\n const addScript = () => {\n if (!document) {\n return callback('document not found')\n }\n let scriptTag: HTMLScriptElement | null = document.createElement('script')\n scriptTag.type = 'text/javascript'\n scriptTag.crossOrigin = 'anonymous'\n scriptTag.src = url\n scriptTag.onload = (event) => {\n // mark the script as having had its callback fired, so we can avoid double-calling it\n ;(scriptTag as any).__posthog_loading_callback_fired = true\n callback(undefined, event)\n }\n scriptTag.onerror = (error) => callback(error)\n\n if (posthog.config.prepare_external_dependency_script) {\n scriptTag = posthog.config.prepare_external_dependency_script(scriptTag)\n }\n\n if (!scriptTag) {\n return callback('prepare_external_dependency_script returned null')\n }\n\n if (posthog.config.external_scripts_inject_target === 'head') {\n document.head.appendChild(scriptTag)\n } else {\n const scripts = document.querySelectorAll('body > script')\n if (scripts.length > 0) {\n scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n } else {\n document.body.appendChild(scriptTag)\n }\n }\n }\n\n if (document?.body) {\n addScript()\n } else {\n // Inlining this because we don't care about `passive: true` here\n // and this saves us ~3% of the bundle size\n // eslint-disable-next-line posthog-js/no-add-event-listener\n document?.addEventListener('DOMContentLoaded', addScript)\n }\n}\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.loadExternalDependency = (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n): void => {\n // remote-config always loads from the token-specific path\n if (kind === 'remote-config') {\n const url = posthog.requestRouter.endpointFor('assets', `/array/${posthog.config.token}/config.js`)\n loadScript(posthog, url, callback)\n return\n }\n\n let url: string\n\n if (posthog.config.strict_script_versioning) {\n // posthog.version is baked into the executing array.js bundle, so this points at\n // the exact semver-qualified sibling asset without relying on alias redirects.\n url = posthog.requestRouter.endpointFor('assets', `/static/${posthog.version}/${kind}.js`)\n } else {\n let scriptUrlToLoad = `/static/${kind}.js?v=${posthog.version}`\n\n if (kind === 'toolbar') {\n // toolbar.js has a 24-hour CDN TTL but contains a rotating token valid for\n // only 5 minutes. Bust the cache on a 5-minute boundary so the browser always\n // fetches a fresh copy with a valid token.\n const fiveMinutesInMillis = 5 * 60 * 1000\n const timestampToNearestFiveMinutes = Math.floor(Date.now() / fiveMinutesInMillis) * fiveMinutesInMillis\n scriptUrlToLoad = `${scriptUrlToLoad}&t=${timestampToNearestFiveMinutes}`\n }\n\n url = posthog.requestRouter.endpointFor('assets', scriptUrlToLoad)\n }\n\n loadScript(posthog, url, callback)\n}\n\nassignableWindow.__PosthogExtensions__.loadSiteApp = (\n posthog: PostHog,\n url: string,\n callback: (error?: string | Event, event?: Event) => void\n): void => {\n const scriptUrl = posthog.requestRouter.endpointFor('api', url)\n\n loadScript(posthog, scriptUrl, callback)\n}\n","import Config from '@posthog/browser-common/config'\nimport packageInfo from '../package.json'\n\n// overridden in posthog-core,\n// e.g. Config.DEBUG = Config.DEBUG || instance.config.debug\nConfig.DEBUG = false\nConfig.LIB_VERSION = packageInfo.version\nConfig.LIB_NAME = 'web'\n/** The actual JS SDK version, unaffected by _overrideSDKInfo. Used for the `ver` request param. */\nConfig.JS_SDK_VERSION = packageInfo.version\n\nexport default Config\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const DEVICE_MODEL = '$device_model'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\n// V2 Trigger Groups: Per-group persistence key prefixes (suffix with group ID)\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX = '$posthog_sr_group_event_trigger_'\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX = '$posthog_sr_group_url_trigger_'\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX = '$posthog_sr_group_sampling_'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const SESSION_RECORDING_FLUSHED_SIZE = '$sess_rec_flush_size'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\nexport const PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'\nexport const PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS = '$minimal_flag_called_events'\nexport const PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nexport const PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS = '$override_feature_flag_payloads'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_LOADED_AT = '$surveys_loaded_at'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const SURVEYS_ACTIVATED_SESSION = '$surveys_activated_session'\nexport const PRODUCT_TOURS = 'ph_product_tours'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const PRODUCT_TOURS_ACTIVATED_SESSION = '$product_tours_activated_session'\nexport const CONVERSATIONS = '$conversations'\nexport const CONVERSATIONS_LEGACY_WIDGET_SESSION_ID = '$conversations_widget_session_id'\nexport const CONVERSATIONS_LEGACY_TICKET_ID = '$conversations_ticket_id'\nexport const CONVERSATIONS_LEGACY_WIDGET_STATE = '$conversations_widget_state'\nexport const CONVERSATIONS_LEGACY_USER_TRAITS = '$conversations_user_traits'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const FLAG_CALL_REPORTED_SESSION_ID = '$flag_call_reported_session_id'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\nexport const SDK_DEBUG_EXTENSIONS_INIT_METHOD = '$sdk_debug_extensions_init_method'\nexport const SDK_DEBUG_EXTENSIONS_INIT_TIME_MS = '$sdk_debug_extensions_init_time_ms'\nexport const SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED = '$sdk_debug_recording_script_not_loaded'\nexport const SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS = '$sdk_debug_replay_event_trigger_status'\nexport const SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS = '$sdk_debug_replay_linked_flag_trigger_status'\nexport const SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS = '$sdk_debug_replay_matched_recording_trigger_groups'\nexport const SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG = '$sdk_debug_replay_remote_trigger_matching_config'\nexport const SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT = '$sdk_debug_replay_trigger_groups_count'\nexport const SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS = '$sdk_debug_replay_url_trigger_status'\nexport const SDK_DEBUG_REPLAY_RRWEB_ATTACHED = '$sdk_debug_rrweb_attached'\nexport const SDK_DEBUG_REPLAY_RRWEB_START_ATTEMPTED = '$sdk_debug_rrweb_start_attempted'\nexport const SESSION_RECORDING_START_REASON = '$session_recording_start_reason'\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n// How long the cached `$surveys` definitions are considered fresh. After this, the next\n// `getSurveys` call serves the cache immediately but kicks off a background refresh so\n// server-side changes (e.g. a survey switched from popover to API) propagate to a\n// long-lived tab without needing a page reload.\nexport const SURVEYS_CACHE_TTL_MS = 5 * 60 * 1000 // 5 minutes\n// After a failed background refresh we back off for the same window as the cache TTL before\n// trying again. Aliased to make the shared duration intentional rather than coincidental.\nexport const SURVEYS_REFRESH_BACKOFF_MS = SURVEYS_CACHE_TTL_MS\nexport const LOAD_EXT_NOT_FOUND = 'PostHog loadExternalDependency extension not found.'\n\n/* EVENT NAMES - interned to reduce bundle size */\n/* COOKIELESS MODE VALUES */\nexport const COOKIELESS_ON_REJECT = 'on_reject' as const\nexport const COOKIELESS_ALWAYS = 'always' as const\n\n/* USER STATE VALUES */\nexport const USER_STATE_ANONYMOUS = 'anonymous'\nexport const USER_STATE_IDENTIFIED = 'identified'\n\n/* PERSON PROFILE MODES */\nexport const PERSON_PROFILES_IDENTIFIED_ONLY = 'identified_only' as const\n\n/* DOM EVENT NAMES - interned to reduce bundle size */\nexport const DOM_EVENT_VISIBILITYCHANGE = 'visibilitychange'\nexport const DOM_EVENT_BEFOREUNLOAD = 'beforeunload'\n\nexport const EVENT_PAGEVIEW = '$pageview'\nexport const EVENT_PAGELEAVE = '$pageleave'\nexport const EVENT_IDENTIFY = '$identify'\nexport const EVENT_GROUPIDENTIFY = '$groupidentify'\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n","import { hasOwnProperty as core_hasOwnProperty, isArray, isFormData, isNullish, isNumber, isString } from \"@posthog/core\";\nimport { logger } from \"./logger.mjs\";\nfunction find(value, predicate) {\n for(let i = 0; i < value.length; i++)if (predicate(value[i])) return value[i];\n}\nfunction eachArray(obj, iterator) {\n if (isArray(obj)) obj.forEach(iterator);\n}\nfunction each(obj, iterator) {\n if (isNullish(obj)) return;\n if (isArray(obj)) return void obj.forEach(iterator);\n if (isFormData(obj)) return void obj.forEach((val, key)=>iterator(val, key));\n for(const key in obj)if (core_hasOwnProperty.call(obj, key)) iterator(obj[key], key);\n}\nconst extend = function(obj, ...args) {\n for (const source of args)for(const prop in source)if (void 0 !== source[prop]) obj[prop] = source[prop];\n return obj;\n};\nfunction entries(obj) {\n const ownProps = Object.keys(obj);\n let i = ownProps.length;\n const resArray = new Array(i);\n while(i--)resArray[i] = [\n ownProps[i],\n obj[ownProps[i]]\n ];\n return resArray;\n}\nconst trySafe = function(fn) {\n try {\n return fn();\n } catch {\n return;\n }\n};\nconst safewrap = function(f) {\n return function(...args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n logger.critical('Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.');\n logger.critical(e);\n }\n };\n};\nconst safewrapClass = function(klass, functions) {\n for(let i = 0; i < functions.length; i++)klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]]);\n};\nconst stripEmptyProperties = function(p) {\n const ret = {};\n each(p, function(v, k) {\n if (isString(v) && v.length > 0 || isNumber(v)) ret[k] = v;\n });\n return ret;\n};\nfunction deepCircularCopy(value, customizer) {\n const COPY_IN_PROGRESS_SET = new Set();\n function internalDeepCircularCopy(value, key) {\n if (value !== Object(value)) return customizer ? customizer(value, key) : value;\n if (COPY_IN_PROGRESS_SET.has(value)) return;\n COPY_IN_PROGRESS_SET.add(value);\n let result;\n if (isArray(value)) {\n result = [];\n eachArray(value, (it)=>{\n result.push(internalDeepCircularCopy(it));\n });\n } else {\n const copy = {};\n each(value, (val, key)=>{\n if (!COPY_IN_PROGRESS_SET.has(val)) copy[key] = internalDeepCircularCopy(val, key);\n });\n result = copy;\n }\n return result;\n }\n return internalDeepCircularCopy(value);\n}\nfunction _copyAndTruncateStrings(object, maxStringLength) {\n return deepCircularCopy(object, (value)=>{\n if (isString(value)) return value.slice(0, maxStringLength);\n return value;\n });\n}\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = [\n 'herokuapp.com',\n 'vercel.app',\n 'netlify.app'\n];\nfunction isCrossDomainCookie(documentLocation) {\n const hostname = documentLocation?.hostname;\n if (!isString(hostname)) return false;\n const lastTwoParts = hostname.split('.').slice(-2).join('.');\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE)if (lastTwoParts === excluded) return false;\n return true;\n}\nfunction addEventListener(element, event, callback, options) {\n const { capture = false, passive = true } = options ?? {};\n element?.addEventListener(event, callback, {\n capture,\n passive\n });\n}\nfunction migrateConfigField(config, newField, oldField, defaultValue, loggerInstance) {\n const hasNewField = newField in config && !isNullish(config[newField]);\n const hasOldField = oldField in config && !isNullish(config[oldField]);\n if (hasNewField) return config[newField];\n if (hasOldField) {\n if (loggerInstance) loggerInstance.warn(`Config field '${oldField}' is deprecated. Please use '${newField}' instead. The old field will be removed in a future major version.`);\n return config[oldField];\n }\n return defaultValue;\n}\nconst TOOLBAR_INTERNAL_INSTANCE_NAME = 'ph_toolbar_internal';\nfunction isToolbarInstance(config) {\n return config.name === TOOLBAR_INTERNAL_INSTANCE_NAME;\n}\nexport { _copyAndTruncateStrings, addEventListener, each, eachArray, entries, extend, find, isCrossDomainCookie, isToolbarInstance, migrateConfigField, safewrap, safewrapClass, stripEmptyProperties, trySafe };\n","import { document as external_globals_mjs_document } from \"./globals.mjs\";\nconst getCookieValue = (name)=>{\n if (!external_globals_mjs_document) return;\n try {\n const nameEQ = name + '=';\n const cookies = external_globals_mjs_document.cookie.split(';').filter((cookie)=>cookie.length);\n for(let i = 0; i < cookies.length; i++){\n let cookie = cookies[i];\n while(' ' == cookie.charAt(0))cookie = cookie.substring(1, cookie.length);\n if (0 === cookie.indexOf(nameEQ)) return decodeURIComponent(cookie.substring(nameEQ.length, cookie.length));\n }\n } catch {}\n return null;\n};\nexport { getCookieValue };\n","/*! For license information please see uuidv7.mjs.LICENSE.txt */\nimport { window as external_globals_mjs_window } from \"./globals.mjs\";\nimport { isNumber, isUndefined } from \"@posthog/core\";\n/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */ if (!Math.trunc) Math.trunc = function(v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v);\n};\nif (!Number.isInteger) Number.isInteger = function(value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value;\n};\nclass UUID {\n constructor(bytes){\n this.bytes = bytes;\n if (16 !== bytes.length) throw new TypeError('not 128-bit length');\n }\n static fromFieldsV7(unixTsMs, randA, randBHi, randBLo) {\n if (!Number.isInteger(unixTsMs) || !Number.isInteger(randA) || !Number.isInteger(randBHi) || !Number.isInteger(randBLo) || unixTsMs < 0 || randA < 0 || randBHi < 0 || randBLo < 0 || unixTsMs > 0xffffffffffff || randA > 0xfff || randBHi > 0x3fffffff || randBLo > 0xffffffff) throw new RangeError('invalid field value');\n const bytes = new Uint8Array(16);\n bytes[0] = unixTsMs / 2 ** 40;\n bytes[1] = unixTsMs / 2 ** 32;\n bytes[2] = unixTsMs / 2 ** 24;\n bytes[3] = unixTsMs / 2 ** 16;\n bytes[4] = unixTsMs / 256;\n bytes[5] = unixTsMs;\n bytes[6] = 0x70 | randA >>> 8;\n bytes[7] = randA;\n bytes[8] = 0x80 | randBHi >>> 24;\n bytes[9] = randBHi >>> 16;\n bytes[10] = randBHi >>> 8;\n bytes[11] = randBHi;\n bytes[12] = randBLo >>> 24;\n bytes[13] = randBLo >>> 16;\n bytes[14] = randBLo >>> 8;\n bytes[15] = randBLo;\n return new UUID(bytes);\n }\n toString() {\n let text = '';\n for(let i = 0; i < this.bytes.length; i++){\n text = text + (this.bytes[i] >>> 4).toString(16) + (0xf & this.bytes[i]).toString(16);\n if (3 === i || 5 === i || 7 === i || 9 === i) text += '-';\n }\n if (36 !== text.length) throw new Error('Invalid UUIDv7 was generated');\n return text;\n }\n clone() {\n return new UUID(this.bytes.slice(0));\n }\n equals(other) {\n return 0 === this.compareTo(other);\n }\n compareTo(other) {\n for(let i = 0; i < 16; i++){\n const diff = this.bytes[i] - other.bytes[i];\n if (0 !== diff) return Math.sign(diff);\n }\n return 0;\n }\n}\nclass V7Generator {\n generate() {\n const value = this.generateOrAbort();\n if (!isUndefined(value)) return value;\n {\n this._timestamp = 0;\n const valueAfterReset = this.generateOrAbort();\n if (isUndefined(valueAfterReset)) throw new Error('Could not generate UUID after timestamp reset');\n return valueAfterReset;\n }\n }\n generateOrAbort() {\n const MAX_COUNTER = 0x3ffffffffff;\n const ROLLBACK_ALLOWANCE = 10000;\n const ts = Date.now();\n if (ts > this._timestamp) {\n this._timestamp = ts;\n this._resetCounter();\n } else {\n if (!(ts + ROLLBACK_ALLOWANCE > this._timestamp)) return;\n this._counter++;\n if (this._counter > MAX_COUNTER) {\n this._timestamp++;\n this._resetCounter();\n }\n }\n return UUID.fromFieldsV7(this._timestamp, Math.trunc(this._counter / 2 ** 30), this._counter & 2 ** 30 - 1, this._random.nextUint32());\n }\n _resetCounter() {\n this._counter = 0x400 * this._random.nextUint32() + (0x3ff & this._random.nextUint32());\n }\n constructor(){\n this._timestamp = 0;\n this._counter = 0;\n this._random = new DefaultRandom();\n }\n}\nlet getRandomValues = (buffer)=>{\n if ('undefined' != typeof UUIDV7_DENY_WEAK_RNG && UUIDV7_DENY_WEAK_RNG) throw new Error('no cryptographically strong RNG available');\n for(let i = 0; i < buffer.length; i++)buffer[i] = 0x10000 * Math.trunc(0x10000 * Math.random()) + Math.trunc(0x10000 * Math.random());\n return buffer;\n};\nif (external_globals_mjs_window && !isUndefined(external_globals_mjs_window.crypto) && crypto.getRandomValues) getRandomValues = (buffer)=>crypto.getRandomValues(buffer);\nclass DefaultRandom {\n nextUint32() {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer);\n this._cursor = 0;\n }\n return this._buffer[this._cursor++];\n }\n constructor(){\n this._buffer = new Uint32Array(8);\n this._cursor = 1 / 0;\n }\n}\nlet defaultGenerator;\nconst uuidv7 = ()=>uuidv7obj().toString();\nconst uuidv7obj = ()=>(defaultGenerator || (defaultGenerator = new V7Generator())).generate();\nconst uuid7ToTimestampMs = (uuid)=>{\n const hex = uuid.replace(/-/g, '');\n if (32 !== hex.length) throw new Error('Not a valid UUID');\n if ('7' !== hex[12]) throw new Error('Not a UUIDv7');\n return parseInt(hex.substring(0, 12), 16);\n};\nexport { UUID, uuid7ToTimestampMs, uuidv7 };\n","import { extend } from '@posthog/browser-common/utils/general-utils'\nimport { PersistentStore, Properties } from './types'\nimport {\n DEVICE_ID,\n DISTINCT_ID,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n SESSION_ID,\n SESSION_RECORDING_IS_SAMPLED,\n USER_STATE,\n} from './constants'\n\nimport { isNull, isUndefined } from '@posthog/core'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { window, document } from '@posthog/browser-common/utils/globals'\nimport { getCookieValue } from '@posthog/browser-common/utils/cookie-utils'\nimport { uuidv7 } from '@posthog/browser-common/utils/uuidv7'\n\n// we store the discovered subdomain in memory because it might be read multiple times\nlet firstNonPublicSubDomain = ''\n\n// helper to allow tests to clear this \"cache\"\nexport const resetSubDomainCache = () => {\n firstNonPublicSubDomain = ''\n}\n\n/**\n * Browsers don't offer a way to check if something is a public suffix\n * e.g. `.com.au`, `.io`, `.org.uk`\n *\n * But they do reject cookies set on public suffixes\n * Setting a cookie on `.co.uk` would mean it was sent for every `.co.uk` site visited\n *\n * So, we can use this to check if a domain is a public suffix\n * by trying to set a cookie on a subdomain of the provided hostname\n * until the browser accepts it\n *\n * inspired by https://github.com/AngusFu/browser-root-domain\n */\nexport function seekFirstNonPublicSubDomain(hostname: string, cookieJar = document): string {\n if (firstNonPublicSubDomain) {\n return firstNonPublicSubDomain\n }\n\n if (!cookieJar) {\n return ''\n }\n if (['localhost', '127.0.0.1'].includes(hostname)) return ''\n\n const list = hostname.split('.')\n let len = Math.min(list.length, 8) // paranoia - we know this number should be small\n const key = 'dmn_chk_' + uuidv7()\n\n while (!firstNonPublicSubDomain && len--) {\n const candidate = list.slice(len).join('.')\n const candidateCookieValue = key + '=1;domain=.' + candidate + ';path=/'\n\n // try to set cookie, include a short expiry in seconds since we'll check immediately\n cookieJar.cookie = candidateCookieValue + ';max-age=3'\n\n if (cookieJar.cookie.includes(key)) {\n // the cookie was accepted by the browser, remove the test cookie\n cookieJar.cookie = candidateCookieValue + ';max-age=0'\n firstNonPublicSubDomain = candidate\n }\n }\n\n return firstNonPublicSubDomain\n}\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\nconst originalCookieDomainFn = (hostname: string): string => {\n const matches = hostname.match(DOMAIN_MATCH_REGEX)\n return matches ? matches[0] : ''\n}\n\nexport function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string {\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n let matchedSubDomain = seekFirstNonPublicSubDomain(hostname)\n\n if (!matchedSubDomain) {\n const originalMatch = originalCookieDomainFn(hostname)\n if (originalMatch !== matchedSubDomain) {\n logger.info('Warning: cookie subdomain discovery mismatch', originalMatch, matchedSubDomain)\n }\n matchedSubDomain = originalMatch\n }\n\n return matchedSubDomain ? '; domain=.' + matchedSubDomain : ''\n }\n return ''\n}\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n _is_supported: () => !!document,\n\n _error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n _get: getCookieValue,\n\n _parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore._get(name)) || {}\n } catch {\n // noop\n }\n return cookie\n },\n\n _set: function (name, value, days, cross_subdomain, is_secure) {\n if (!document) {\n return false\n }\n try {\n let expires = '',\n secure = ''\n\n const cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain)\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n\n // 4096 bytes is the size at which some browsers (e.g. firefox) will not store a cookie, warn slightly before that\n if (new_cookie_val.length > 4096 * 0.9) {\n logger.warn('cookieStore warning: large cookie, len=' + new_cookie_val.length)\n }\n\n document.cookie = new_cookie_val\n return true\n } catch {\n return false\n }\n },\n\n _remove: function (name, cross_subdomain) {\n if (!document?.cookie) {\n return\n }\n try {\n cookieStore._set(name, '', -1, cross_subdomain)\n } catch {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\nexport const resetLocalStorageSupported = () => {\n _localStorage_supported = null\n}\n\nexport const localStore: PersistentStore = {\n _is_supported: function () {\n if (!isNull(_localStorage_supported)) {\n return _localStorage_supported\n }\n\n let supported = true\n if (!isUndefined(window)) {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore._set(key, val)\n if (localStore._get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore._remove(key)\n } catch {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n _error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n _get: function (name) {\n try {\n return window?.localStorage.getItem(name)\n } catch (err) {\n localStore._error(err)\n }\n return null\n },\n\n _parse: function (name) {\n try {\n return JSON.parse(localStore._get(name)) || {}\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value) {\n try {\n window?.localStorage.setItem(name, JSON.stringify(value))\n return true\n } catch (err) {\n localStore._error(err)\n }\n return false\n },\n\n _remove: function (name) {\n try {\n window?.localStorage.removeItem(name)\n } catch (err) {\n localStore._error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [\n DEVICE_ID,\n DISTINCT_ID,\n SESSION_ID,\n SESSION_RECORDING_IS_SAMPLED,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n USER_STATE,\n]\n\n/**\n * Creates a localPlusCookieStore instance with custom cookie-persisted properties.\n *\n * When `preferCookieOnConflict` is true, the cookie's values win over localStorage on\n * merge for any key both stores carry. Null/empty cookie values are filtered out\n * before the merge so a malformed legacy cookie cannot override valid localStorage\n * data. localStorage-only keys are unaffected. See the docs for\n * `__preview_cookie_wins_on_conflict` for context.\n */\nexport const createLocalPlusCookieStore = (\n customCookieProperties: readonly string[] = [],\n preferCookieOnConflict: boolean = false\n): PersistentStore => {\n const cookiePropertiesToPersist = [...COOKIE_PERSISTED_PROPERTIES, ...customCookieProperties]\n\n return {\n ...localStore,\n _parse: function (name) {\n try {\n let cookieProperties: Properties = {}\n try {\n // See if there's a cookie stored with data.\n cookieProperties = cookieStore._parse(name) || {}\n } catch {}\n const localStorageData: Properties = JSON.parse(localStore._get(name) || '{}')\n let value: Properties\n if (preferCookieOnConflict) {\n // Defensive: skip null / empty-string cookie values so a malformed\n // legacy cookie cannot wipe out valid localStorage data.\n const safeCookieProperties: Properties = {}\n for (const key in cookieProperties) {\n const v = cookieProperties[key]\n if (!isNull(v) && v !== '') {\n safeCookieProperties[key] = v\n }\n }\n value = extend(localStorageData, safeCookieProperties)\n } else {\n value = extend(cookieProperties, localStorageData)\n }\n localStore._set(name, value)\n return value\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value, days, cross_subdomain, is_secure, debug) {\n // The localStorage write is the durable one and reports its own\n // success. The cookie mirror is best-effort: a cookie failure must\n // not flip an already-landed localStorage write to `false`, or the\n // caller would treat the durable entry as un-persisted and re-write\n // it on every later save.\n const stored = localStore._set(name, value, undefined, undefined, debug)\n try {\n const cookiePersistedProperties: Record<string, any> = {}\n cookiePropertiesToPersist.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore._set(name, cookiePersistedProperties, days, cross_subdomain, is_secure, debug)\n }\n } catch (err) {\n localStore._error(err)\n }\n return stored\n },\n\n _remove: function (name, cross_subdomain) {\n try {\n window?.localStorage.removeItem(name)\n cookieStore._remove(name, cross_subdomain)\n } catch (err) {\n localStore._error(err)\n }\n },\n }\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n _is_supported: function () {\n return true\n },\n\n _error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n _get: function (name) {\n return memoryStorage[name] || null\n },\n\n _parse: function (name) {\n return memoryStorage[name] || null\n },\n\n _set: function (name, value) {\n memoryStorage[name] = value\n return true\n },\n\n _remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n _is_supported: function () {\n if (!isNull(sessionStorageSupported)) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (!isUndefined(window)) {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore._set(key, val)\n if (sessionStore._get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore._remove(key)\n } catch {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n _error: function (msg) {\n logger.error('sessionStorage error: ', msg)\n },\n\n _get: function (name) {\n try {\n return window?.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore._error(err)\n }\n return null\n },\n\n _parse: function (name) {\n try {\n return JSON.parse(sessionStore._get(name)) || null\n } catch {\n // noop\n }\n return null\n },\n\n _set: function (name, value) {\n try {\n window?.sessionStorage.setItem(name, JSON.stringify(value))\n return true\n } catch (err) {\n sessionStore._error(err)\n }\n return false\n },\n\n _remove: function (name) {\n try {\n window?.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore._error(err)\n }\n },\n}\n","import { PostHog } from './posthog-core'\nimport { COOKIELESS_ALWAYS, COOKIELESS_ON_REJECT } from './constants'\nimport { navigator } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\nimport { cookieStore, localStore } from './storage'\nimport { PersistentStore } from './types'\nimport { isNoLike, isYesLike } from '@posthog/core'\n\nconst OPT_OUT_PREFIX = '__ph_opt_in_out_'\n\nexport const ConsentStatus = {\n PENDING: -1,\n DENIED: 0,\n GRANTED: 1,\n} as const\nexport type ConsentStatus = (typeof ConsentStatus)[keyof typeof ConsentStatus]\n\n/**\n * ConsentManager provides tools for managing user consent as configured by the application.\n */\nexport class ConsentManager {\n private _persistentStore?: PersistentStore\n\n constructor(private _instance: PostHog) {}\n\n private get _config() {\n return this._instance.config\n }\n\n public get consent(): ConsentStatus {\n if (this._getDnt()) {\n return ConsentStatus.DENIED\n }\n\n return this._storedConsent\n }\n\n public isOptedOut() {\n if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n return true\n }\n // we are opted out if we are rejected, or if consent is pending and we are in cookieless mode \"on_reject\"\n return (\n this.isRejected() ||\n (this.consent === ConsentStatus.PENDING && this._config.cookieless_mode === COOKIELESS_ON_REJECT)\n )\n }\n\n public isOptedIn() {\n return !this.isOptedOut()\n }\n\n public isExplicitlyOptedOut() {\n return this.consent === ConsentStatus.DENIED\n }\n\n public isRejected() {\n return (\n this.consent === ConsentStatus.DENIED ||\n (this.consent === ConsentStatus.PENDING && this._config.opt_out_capturing_by_default)\n )\n }\n\n public optInOut(isOptedIn: boolean) {\n this._storage._set(\n this._storageKey,\n isOptedIn ? 1 : 0,\n this._config.cookie_expiration,\n this._config.cross_subdomain_cookie,\n this._config.secure_cookie\n )\n }\n\n public reset() {\n this._storage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n }\n\n private get _storageKey() {\n const { token, opt_out_capturing_cookie_prefix, consent_persistence_name } = this._instance.config\n if (consent_persistence_name) {\n return consent_persistence_name\n } else if (opt_out_capturing_cookie_prefix) {\n // Deprecated, but we still support it for backwards compatibility.\n // This was deprecated because it differed in behaviour from storage.ts, and appends the token.\n // This meant it was not possible to share the same consent state across multiple PostHog instances,\n // and made it harder for people to migrate from other systems.\n return opt_out_capturing_cookie_prefix + token\n } else {\n return OPT_OUT_PREFIX + token\n }\n }\n\n private get _storedConsent(): ConsentStatus {\n const value = this._storage._get(this._storageKey)\n // be somewhat permissive in what we accept as yes/opt-in, to make it easier for people to migrate from other systems\n return isYesLike(value) ? ConsentStatus.GRANTED : isNoLike(value) ? ConsentStatus.DENIED : ConsentStatus.PENDING\n }\n\n private get _storage() {\n // Re-evaluate the store on every access so that a config change after the first\n // access (e.g. init() called after _dom_loaded() fires in bundled apps) is picked\n // up and any value already stored under the old backend is migrated across.\n const persistenceType = this._config.opt_out_capturing_persistence_type\n const expectedStore = persistenceType === 'localStorage' ? localStore : cookieStore\n\n if (!this._persistentStore || this._persistentStore !== expectedStore) {\n this._persistentStore = expectedStore\n const otherStorage = persistenceType === 'localStorage' ? cookieStore : localStore\n\n if (otherStorage._get(this._storageKey)) {\n if (!this._persistentStore._get(this._storageKey)) {\n // This indicates we have moved to a new storage format so we migrate the value over\n this.optInOut(isYesLike(otherStorage._get(this._storageKey)))\n }\n\n otherStorage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n }\n }\n\n return this._persistentStore\n }\n\n private _getDnt(): boolean {\n if (!this._config.respect_dnt) {\n return false\n }\n return [\n navigator?.doNotTrack, // standard\n (navigator as any)?.['msDoNotTrack'],\n assignableWindow['doNotTrack'],\n ].some((dntValue) => isYesLike(dntValue))\n }\n}\n","import { isFunction, isString, isUndefined } from \"@posthog/core\";\nimport { window as external_globals_mjs_window } from \"./globals.mjs\";\nimport { logger } from \"./logger.mjs\";\nfunction applyUrlTargetingOverride(instance, defaultUrl) {\n const override = instance?.config?.get_current_url;\n if (!isFunction(override)) return defaultUrl;\n try {\n const result = override(defaultUrl);\n return isString(result) && result ? result : defaultUrl;\n } catch (e) {\n logger.error('Error in get_current_url, falling back to window.location.href', e);\n return defaultUrl;\n }\n}\nfunction getTargetingUrl(instance) {\n const defaultUrl = external_globals_mjs_window?.location?.href;\n return isUndefined(defaultUrl) ? void 0 : applyUrlTargetingOverride(instance, defaultUrl);\n}\nexport { applyUrlTargetingOverride, getTargetingUrl };\n","const TOOLBAR_ID = '__POSTHOG_TOOLBAR__';\nconst TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container';\nconst SDK_DIST_CHANNEL = '$sdk_dist_channel';\nexport { SDK_DIST_CHANNEL, TOOLBAR_CONTAINER_CLASS, TOOLBAR_ID };\n","import { TOOLBAR_CONTAINER_CLASS, TOOLBAR_ID } from \"../constants.mjs\";\nconst NODE_TYPE_ELEMENT = 1;\nconst NODE_TYPE_TEXT = 3;\nconst NODE_TYPE_DOCUMENT_FRAGMENT = 11;\nfunction isElementInToolbar(el) {\n if (el instanceof Element) return el.id === TOOLBAR_ID || !!el.closest?.('.' + TOOLBAR_CONTAINER_CLASS);\n return false;\n}\nfunction isElementNode(el) {\n return !!el && el.nodeType === NODE_TYPE_ELEMENT;\n}\nfunction isTag(el, tag) {\n return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase();\n}\nfunction isTextNode(el) {\n return !!el && el.nodeType === NODE_TYPE_TEXT;\n}\nfunction isShadowRoot(el) {\n return !!el && el.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && isElementNode(el.host);\n}\nexport { isElementInToolbar, isElementNode, isShadowRoot, isTag, isTextNode };\n","import { each, entries } from \"./general-utils.mjs\";\nimport { includes, isArray, isBoolean, isNullish, isString, isUndefined, trim } from \"@posthog/core\";\nimport { logger } from \"./logger.mjs\";\nimport { window as external_globals_mjs_window } from \"./globals.mjs\";\nimport { getTargetingUrl } from \"./url-targeting-utils.mjs\";\nimport { isElementNode, isShadowRoot, isTag, isTextNode } from \"./element-utils.mjs\";\nconst MAX_DOM_ANCESTOR_DEPTH = 1000;\nfunction splitClassString(s) {\n return s ? trim(s).split(/\\s+/) : [];\n}\nfunction checkForURLMatches(urlsList, instance) {\n const url = getTargetingUrl(instance);\n return !!(url && urlsList && urlsList.some((regex)=>url.match(regex)));\n}\nfunction getClassNames(el) {\n let className = '';\n switch(typeof el.className){\n case 'string':\n className = el.className;\n break;\n case 'object':\n className = (el.className && 'baseVal' in el.className ? el.className.baseVal : null) || el.getAttribute('class') || '';\n break;\n default:\n className = '';\n }\n return splitClassString(className);\n}\nfunction makeSafeText(s) {\n if (isNullish(s)) return null;\n return trim(s).split(/(\\s+)/).filter((s)=>shouldCaptureValue(s)).join('').replace(/[\\r\\n]/g, ' ').replace(/[ ]+/g, ' ').substring(0, 255);\n}\nfunction getSafeText(el) {\n let elText = '';\n if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) each(el.childNodes, function(child) {\n if (isTextNode(child) && child.textContent) elText += makeSafeText(child.textContent) ?? '';\n });\n return trim(elText);\n}\nfunction getEventTarget(e) {\n if (isUndefined(e.target)) return e.srcElement || null;\n if (e.target?.shadowRoot) return e.composedPath()[0] || null;\n return e.target || null;\n}\nconst autocaptureCompatibleElements = [\n 'a',\n 'button',\n 'form',\n 'input',\n 'select',\n 'textarea',\n 'label'\n];\nfunction checkIfElementTreePassesElementAllowList(elements, autocaptureConfig) {\n const allowlist = autocaptureConfig?.element_allowlist;\n if (isUndefined(allowlist)) return true;\n for (const el of elements)if (allowlist.some((elementType)=>el.tagName.toLowerCase() === elementType)) return true;\n return false;\n}\nfunction elementMatchesCSSSelector(el, selector) {\n const matches = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector;\n try {\n return matches ? matches.call(el, selector) : false;\n } catch {\n return false;\n }\n}\nfunction checkIfElementsMatchCSSSelector(elements, selectorList) {\n if (isUndefined(selectorList)) return true;\n for (const el of elements)if (selectorList.some((selector)=>elementMatchesCSSSelector(el, selector))) return true;\n return false;\n}\nfunction getParentElement(curEl) {\n const parentNode = curEl.parentNode;\n if (!parentNode || !isElementNode(parentNode)) return false;\n return parentNode;\n}\nconst DEFAULT_AUTOCAPTURE_IGNORE_LIST = [\n '.ph-no-autocapture',\n '[data-ph-no-autocapture]'\n];\nconst DEFAULT_CONTENT_IGNORELIST = [\n 'next',\n 'previous',\n 'prev',\n '>',\n '<'\n];\nconst DEFAULT_CONTENT_IGNORELIST_WITH_STEPPERS = [\n ...DEFAULT_CONTENT_IGNORELIST,\n '+',\n '-',\n \"\\u2212\",\n \"\\u2013\"\n];\nconst MAX_CONTENT_IGNORELIST_ENTRIES = 10;\nconst matchesContentKeyword = (text, keyword)=>/[a-z0-9]/i.test(keyword) ? text.includes(keyword) : text === keyword;\nfunction shouldIgnoreByContent(contentIgnorelist, elementsWithText) {\n if (false === contentIgnorelist || isUndefined(contentIgnorelist)) return false;\n let keywords;\n if (true === contentIgnorelist) keywords = DEFAULT_CONTENT_IGNORELIST;\n else {\n if (!isArray(contentIgnorelist)) return false;\n if (contentIgnorelist.length > MAX_CONTENT_IGNORELIST_ENTRIES) {\n logger.error(`[PostHog] content_ignorelist array cannot exceed ${MAX_CONTENT_IGNORELIST_ENTRIES} items. Use css_selector_ignorelist for more complex matching.`);\n return false;\n }\n keywords = contentIgnorelist.map((k)=>k.toLowerCase());\n }\n return elementsWithText.some(({ safeText, ariaLabel })=>keywords.some((keyword)=>matchesContentKeyword(safeText, keyword) || matchesContentKeyword(ariaLabel, keyword)));\n}\nconst DEFAULT_DEAD_CLICK_IGNORE_LIST = [\n '.ph-no-deadclick',\n '.ph-no-capture'\n];\nfunction shouldCaptureDeadClick(el, _config) {\n if (!external_globals_mjs_window || cannotCheckForAutocapture(el)) return false;\n const selectorIgnoreList = isBoolean(_config) ? DEFAULT_DEAD_CLICK_IGNORE_LIST : _config?.css_selector_ignorelist ?? DEFAULT_DEAD_CLICK_IGNORE_LIST;\n const { targetElementList } = getElementAndParentsForElement(el, false);\n return !checkIfElementsMatchCSSSelector(targetElementList, selectorIgnoreList);\n}\nconst DEFAULT_RAGE_CLICK_IGNORE_LIST = [\n '.ph-no-rageclick',\n '.ph-no-capture'\n];\nconst TEXT_SELECTION_INPUT_TYPES = [\n '',\n 'text',\n 'search',\n 'email',\n 'password',\n 'url',\n 'tel',\n 'number'\n];\nfunction isContentEditableTarget(el) {\n if (el.isContentEditable) return true;\n const contentEditable = el.getAttribute?.('contenteditable');\n return 'true' === contentEditable || '' === contentEditable;\n}\nfunction isTextSelectionTarget(el) {\n if (!el || !isElementNode(el)) return false;\n if (isTag(el, 'textarea')) return true;\n if (isTag(el, 'input')) return includes(TEXT_SELECTION_INPUT_TYPES, (el.getAttribute('type') || '').toLowerCase());\n return isContentEditableTarget(el);\n}\nfunction shouldCaptureRageclick(el, _config) {\n if (!external_globals_mjs_window || cannotCheckForAutocapture(el)) return false;\n let selectorIgnoreList;\n let contentIgnorelist;\n let ignoreTextSelection;\n if (isBoolean(_config)) {\n selectorIgnoreList = _config ? DEFAULT_RAGE_CLICK_IGNORE_LIST : false;\n contentIgnorelist = void 0;\n ignoreTextSelection = false;\n } else {\n selectorIgnoreList = _config?.css_selector_ignorelist ?? DEFAULT_RAGE_CLICK_IGNORE_LIST;\n contentIgnorelist = _config?.content_ignorelist;\n ignoreTextSelection = _config?.ignore_text_selection ?? false;\n }\n if (false === selectorIgnoreList) return false;\n if (ignoreTextSelection && isTextSelectionTarget(el)) return false;\n const { targetElementList } = getElementAndParentsForElement(el, false);\n const elementsWithText = targetElementList.map((element)=>({\n safeText: getSafeText(element).toLowerCase(),\n ariaLabel: element.getAttribute('aria-label')?.toLowerCase().trim() || ''\n }));\n if (shouldIgnoreByContent(contentIgnorelist, elementsWithText)) return false;\n return !checkIfElementsMatchCSSSelector(targetElementList, selectorIgnoreList);\n}\nconst cannotCheckForAutocapture = (el)=>!el || isTag(el, 'html') || !isElementNode(el);\nconst getElementAndParentsForElement = (el, captureOnAnyElement)=>{\n if (!external_globals_mjs_window || cannotCheckForAutocapture(el)) return {\n parentIsUsefulElement: false,\n targetElementList: []\n };\n let parentIsUsefulElement = false;\n const targetElementList = [\n el\n ];\n let curEl = el;\n while(curEl.parentNode && !isTag(curEl, 'body')){\n if (isShadowRoot(curEl.parentNode)) {\n targetElementList.push(curEl.parentNode.host);\n curEl = curEl.parentNode.host;\n continue;\n }\n const parentNode = getParentElement(curEl);\n if (!parentNode) break;\n if (captureOnAnyElement || autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) parentIsUsefulElement = true;\n else try {\n const compStyles = external_globals_mjs_window.getComputedStyle(parentNode);\n if (compStyles && 'pointer' === compStyles.getPropertyValue('cursor')) parentIsUsefulElement = true;\n } catch {}\n targetElementList.push(parentNode);\n curEl = parentNode;\n }\n return {\n parentIsUsefulElement,\n targetElementList\n };\n};\nfunction shouldSkipDeadClick(el) {\n if (!external_globals_mjs_window || cannotCheckForAutocapture(el)) return false;\n const { targetElementList } = getElementAndParentsForElement(el, false);\n return targetElementList.some((node)=>isTag(node, 'a'));\n}\nfunction shouldCaptureDomEvent(el, event, autocaptureConfig, captureOnAnyElement, allowedEventTypes, instance) {\n if (!external_globals_mjs_window || cannotCheckForAutocapture(el)) return false;\n if (autocaptureConfig?.url_allowlist) {\n if (!checkForURLMatches(autocaptureConfig.url_allowlist, instance)) return false;\n }\n if (autocaptureConfig?.url_ignorelist) {\n if (checkForURLMatches(autocaptureConfig.url_ignorelist, instance)) return false;\n }\n if (autocaptureConfig?.dom_event_allowlist) {\n const allowlist = autocaptureConfig.dom_event_allowlist;\n if (allowlist && !allowlist.some((eventType)=>event.type === eventType)) return false;\n }\n const { parentIsUsefulElement, targetElementList } = getElementAndParentsForElement(el, captureOnAnyElement);\n if (!checkIfElementTreePassesElementAllowList(targetElementList, autocaptureConfig)) return false;\n if (!checkIfElementsMatchCSSSelector(targetElementList, autocaptureConfig?.css_selector_allowlist)) return false;\n const selectorIgnoreList = autocaptureConfig?.css_selector_ignorelist ?? DEFAULT_AUTOCAPTURE_IGNORE_LIST;\n if (checkIfElementsMatchCSSSelector(targetElementList, selectorIgnoreList)) return false;\n try {\n const compStyles = external_globals_mjs_window.getComputedStyle(el);\n if (compStyles && 'pointer' === compStyles.getPropertyValue('cursor') && 'click' === event.type) return true;\n } catch {}\n const tag = el.tagName.toLowerCase();\n switch(tag){\n case 'html':\n return false;\n case 'form':\n return (allowedEventTypes || [\n 'submit'\n ]).indexOf(event.type) >= 0;\n case 'input':\n case 'select':\n case 'textarea':\n return (allowedEventTypes || [\n 'change',\n 'click'\n ]).indexOf(event.type) >= 0;\n default:\n if (parentIsUsefulElement) return (allowedEventTypes || [\n 'click'\n ]).indexOf(event.type) >= 0;\n return (allowedEventTypes || [\n 'click'\n ]).indexOf(event.type) >= 0 && (autocaptureCompatibleElements.indexOf(tag) > -1 || 'true' === el.getAttribute('contenteditable'));\n }\n}\nfunction shouldCaptureElement(el) {\n const seen = new Set();\n let depth = 0;\n for(let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode){\n if (depth++ >= MAX_DOM_ANCESTOR_DEPTH || seen.has(curEl)) return false;\n seen.add(curEl);\n const classes = getClassNames(curEl);\n if (includes(classes, 'ph-sensitive') || includes(classes, 'ph-no-capture')) return false;\n }\n if (includes(getClassNames(el), 'ph-include')) return true;\n const type = el.type || '';\n if (isString(type)) switch(type.toLowerCase()){\n case 'hidden':\n return false;\n case 'password':\n return false;\n }\n const name = el.name || el.id || '';\n if (isString(name)) {\n const sensitiveNameRegex = /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i;\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) return false;\n }\n return true;\n}\nfunction isSensitiveElement(el) {\n const allowedInputTypes = [\n 'button',\n 'checkbox',\n 'submit',\n 'reset'\n ];\n if (isTag(el, 'input') && !allowedInputTypes.includes(el.type) || isTag(el, 'select') || isTag(el, 'textarea') || 'true' === el.getAttribute('contenteditable')) return true;\n return false;\n}\nconst coreCCPattern = \"(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11})\";\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`);\nconst unanchoredCCRegex = new RegExp(coreCCPattern);\nconst coreSSNPattern = \"\\\\d{3}-?\\\\d{2}-?\\\\d{4}\";\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`);\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`);\nfunction shouldCaptureValue(value, anchorRegexes = true) {\n if (isNullish(value)) return false;\n if (isString(value)) {\n value = trim(value);\n const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex;\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) return false;\n const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex;\n if (ssnRegex.test(value)) return false;\n }\n return true;\n}\nfunction isAngularStyleAttr(attributeName) {\n if (isString(attributeName)) return '_ngcontent' === attributeName.substring(0, 10) || '_nghost' === attributeName.substring(0, 7);\n return false;\n}\nfunction getDirectAndNestedSpanText(target) {\n let text = getSafeText(target);\n text = `${text} ${getNestedSpanText(target)}`.trim();\n return shouldCaptureValue(text) ? text : '';\n}\nfunction getNestedSpanText(target) {\n let text = '';\n if (target && target.childNodes && target.childNodes.length) each(target.childNodes, function(child) {\n if (child && child.tagName?.toLowerCase() === 'span') try {\n const spanText = getSafeText(child);\n text = `${text} ${spanText}`.trim();\n if (child.childNodes && child.childNodes.length) text = `${text} ${getNestedSpanText(child)}`.trim();\n } catch (e) {\n logger.error('[AutoCapture]', e);\n }\n });\n return text;\n}\nfunction getElementsChainString(elements) {\n return elementsToString(extractElements(elements));\n}\nfunction escapeQuotes(input) {\n return input.replace(/\"|\\\\\"/g, '\\\\\"');\n}\nfunction elementsToString(elements) {\n const ret = elements.map((element)=>{\n let el_string = '';\n if (element.tag_name) el_string += element.tag_name;\n if (element.attr_class) {\n element.attr_class.sort();\n for (const single_class of element.attr_class)el_string += `.${single_class.replace(/\"/g, '')}`;\n }\n const attributes = {\n ...element.text ? {\n text: element.text\n } : {},\n 'nth-child': element.nth_child ?? 0,\n 'nth-of-type': element.nth_of_type ?? 0,\n ...element.href ? {\n href: element.href\n } : {},\n ...element.attr_id ? {\n attr_id: element.attr_id\n } : {},\n ...element.attributes\n };\n const sortedAttributes = {};\n entries(attributes).sort(([a], [b])=>a.localeCompare(b)).forEach(([key, value])=>sortedAttributes[escapeQuotes(key.toString())] = escapeQuotes(value.toString()));\n el_string += ':';\n el_string += entries(sortedAttributes).map(([key, value])=>`${key}=\"${value}\"`).join('');\n return el_string;\n });\n return ret.join(';');\n}\nfunction extractElements(elements) {\n return elements.map((el)=>{\n const attributes = {};\n const response = {\n text: el['$el_text']?.slice(0, 400),\n tag_name: el['tag_name'],\n href: el['attr__href']?.slice(0, 2048),\n attr_class: extractAttrClass(el),\n attr_id: el['attr__id'],\n nth_child: el['nth_child'],\n nth_of_type: el['nth_of_type'],\n attributes\n };\n entries(el).filter(([key])=>0 === key.indexOf('attr__')).forEach(([key, value])=>response.attributes[key] = value);\n return response;\n });\n}\nfunction extractAttrClass(el) {\n const attr_class = el['attr__class'];\n if (!attr_class) return;\n if (isArray(attr_class)) return attr_class;\n return splitClassString(attr_class);\n}\nexport { DEFAULT_CONTENT_IGNORELIST_WITH_STEPPERS, MAX_DOM_ANCESTOR_DEPTH, autocaptureCompatibleElements, getClassNames, getDirectAndNestedSpanText, getElementsChainString, getEventTarget, getNestedSpanText, getParentElement, getSafeText, isAngularStyleAttr, isSensitiveElement, isTextSelectionTarget, makeSafeText, shouldCaptureDeadClick, shouldCaptureDomEvent, shouldCaptureElement, shouldCaptureRageclick, shouldCaptureValue, shouldSkipDeadClick, splitClassString };\n","import { PostHog } from '../posthog-core'\nimport { DEAD_CLICKS_ENABLED_SERVER_SIDE } from '../constants'\nimport { isBoolean, isObject } from '@posthog/core'\nimport { document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow, LazyLoadedDeadClicksAutocaptureInterface } from '../utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { DeadClicksAutoCaptureConfig, RemoteConfigResult } from '../types'\nimport type { Extension } from './types'\n\nconst logger = createLogger('[Dead Clicks]')\n\nexport const isDeadClicksEnabledForHeatmaps = () => {\n return true\n}\nexport const isDeadClicksEnabledForAutocapture = (instance: DeadClicksAutocapture) => {\n const isRemoteEnabled = !!instance.instance.persistence?.get_property(DEAD_CLICKS_ENABLED_SERVER_SIDE)\n const clientConfig = instance.instance.config.capture_dead_clicks\n if (isBoolean(clientConfig)) {\n return clientConfig\n }\n if (isObject(clientConfig)) {\n return true\n }\n return isRemoteEnabled\n}\n\nexport class DeadClicksAutocapture implements Extension {\n get lazyLoadedDeadClicksAutocapture(): LazyLoadedDeadClicksAutocaptureInterface | undefined {\n return this._lazyLoadedDeadClicksAutocapture\n }\n\n private _lazyLoadedDeadClicksAutocapture: LazyLoadedDeadClicksAutocaptureInterface | undefined\n\n constructor(\n readonly instance: PostHog,\n readonly isEnabled: (dca: DeadClicksAutocapture) => boolean,\n readonly onCapture?: DeadClicksAutoCaptureConfig['__onCapture']\n ) {\n this.startIfEnabledOrStop()\n }\n\n public onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without a captureDeadClicks key.\n return\n }\n\n const response = result.config\n if (!('captureDeadClicks' in response)) {\n return\n }\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [DEAD_CLICKS_ENABLED_SERVER_SIDE]: response.captureDeadClicks,\n })\n }\n this.startIfEnabledOrStop()\n }\n\n public startIfEnabledOrStop() {\n if (this.isEnabled(this)) {\n this._loadScript(() => {\n this._start()\n })\n } else {\n this.stop()\n }\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture) {\n // already loaded\n cb()\n return\n }\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this.instance,\n 'dead-clicks-autocapture',\n (err) => {\n if (err) {\n logger.error('failed to load script', err)\n return\n }\n cb()\n }\n )\n }\n\n private _start() {\n if (!document) {\n logger.error('`document` not found. Cannot start.')\n return\n }\n\n if (\n !this._lazyLoadedDeadClicksAutocapture &&\n assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture\n ) {\n // copied so the writes below can't leak into the user's config object, which is\n // shared between the autocapture and heatmaps instances of this extension\n const config: DeadClicksAutoCaptureConfig = isObject(this.instance.config.capture_dead_clicks)\n ? { ...this.instance.config.capture_dead_clicks }\n : {}\n config.__onCapture = this.onCapture\n if (this.onCapture) {\n // an external consumer (heatmaps) only plots click points, so it never observes swipes\n config.capture_dead_swipes = false\n }\n\n this._lazyLoadedDeadClicksAutocapture = assignableWindow.__PosthogExtensions__.initDeadClicksAutocapture(\n this.instance,\n config\n )\n this._lazyLoadedDeadClicksAutocapture.start(document)\n logger.info(`starting...`)\n }\n }\n\n stop() {\n if (this._lazyLoadedDeadClicksAutocapture) {\n this._lazyLoadedDeadClicksAutocapture.stop()\n this._lazyLoadedDeadClicksAutocapture = undefined\n logger.info(`stopping...`)\n }\n }\n}\n","/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n * ```js\n * // After your standard segment anyalytics install\n * analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n * analytics.ready(() => {\n * posthog.init('<posthog-api-key>', {\n * capture_pageview: false,\n * segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n * });\n * window.analytics.page();\n * })\n * ```\n */\nimport { PostHog } from '../posthog-core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nimport { EVENT_IDENTIFY, EVENT_PAGEVIEW, USER_STATE, USER_STATE_IDENTIFIED } from '../constants'\nimport { isFunction } from '@posthog/core'\nimport { uuidv7 } from '@posthog/browser-common/utils/uuidv7'\n\nimport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin } from '@posthog/types'\n\n// Re-export for backwards compatibility\nexport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin }\n\nconst logger = createLogger('[SegmentIntegration]')\n\nconst createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n if (typeof Promise === 'undefined' || !Promise.resolve) {\n logger.warn('This browser does not have Promise support, and can not use the segment integration')\n }\n\n const enrichEvent = (ctx: SegmentContext, eventName: string | undefined) => {\n if (!eventName) {\n return ctx\n }\n if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n logger.info('No userId set, resetting PostHog')\n posthog.reset()\n }\n if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n logger.info('UserId set, identifying with PostHog')\n posthog.identify(ctx.event.userId)\n }\n\n const additionalProperties = posthog.calculateEventProperties(eventName, ctx.event.properties)\n ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n return ctx\n }\n\n return {\n name: 'PostHog JS',\n type: 'enrichment',\n version: '1.0.0',\n isLoaded: () => true,\n // check and early return above\n // eslint-disable-next-line compat/compat\n load: () => Promise.resolve(),\n track: (ctx) => enrichEvent(ctx, ctx.event.event),\n page: (ctx) => enrichEvent(ctx, EVENT_PAGEVIEW),\n identify: (ctx) => enrichEvent(ctx, EVENT_IDENTIFY),\n screen: (ctx) => enrichEvent(ctx, '$screen'),\n }\n}\n\nfunction setupPostHogFromSegment(posthog: PostHog, done: () => void) {\n const segment = posthog.config.segment\n if (!segment) {\n return done()\n }\n\n const bootstrapUser = (user: SegmentUser) => {\n // Use segments anonymousId instead\n const getSegmentAnonymousId = () => user.anonymousId() || uuidv7()\n posthog.config.get_device_id = getSegmentAnonymousId\n\n // If a segment user ID exists, set it as the distinct_id\n if (user.id()) {\n posthog.register({\n distinct_id: user.id(),\n $device_id: getSegmentAnonymousId(),\n })\n posthog.persistence!.set_property(USER_STATE, USER_STATE_IDENTIFIED)\n }\n\n done()\n }\n\n const segmentUser = segment.user()\n if ('then' in segmentUser && isFunction(segmentUser.then)) {\n segmentUser.then(bootstrapUser)\n } else {\n bootstrapUser(segmentUser as SegmentUser)\n }\n}\n\nexport function setupSegmentIntegration(posthog: PostHog, done: () => void) {\n const segment = posthog.config.segment\n if (!segment) {\n return done()\n }\n\n setupPostHogFromSegment(posthog, () => {\n segment.register(createSegmentIntegration(posthog)).then(() => {\n done()\n })\n })\n}\n","/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n * Sentry.init({\n * dsn: 'https://example',\n * integrations: [\n * new posthog.SentryIntegration(posthog)\n * ]\n * })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n * @param {SeverityLevel[] | '*'} [severityAllowList] Optional: send events matching the provided levels. Use '*' to send all events (default: ['error'])\n * @param {boolean} [sendExceptionsToPostHog] Optional: capture exceptions as events in PostHog (default: true)\n */\n\nimport { PostHog } from '../posthog-core'\nimport { SeverityLevel } from '../types'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n// Event as _SentryEvent,\n// EventProcessor as _SentryEventProcessor,\n// Hub as _SentryHub,\n// Integration as _SentryIntegration,\n// SeverityLevel as _SeverityLevel,\n// IntegrationClass as _SentryIntegrationClass,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryException = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n name: string\n processEvent(event: _SentryEvent): _SentryEvent\n}\n\ninterface _SentryIntegrationClass {\n name: string\n setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\ninterface SentryExceptionProperties {\n $sentry_event_id: any\n $sentry_exception: any\n $sentry_exception_message: any\n $sentry_exception_type: any\n $sentry_tags: any\n $sentry_url?: string\n}\n\nexport type SentryIntegrationOptions = {\n organization?: string\n projectId?: number\n prefix?: string\n severityAllowList?: SeverityLevel[] | '*'\n sendExceptionsToPostHog?: boolean\n}\n\nconst NAME = 'posthog-js'\n\nexport function createEventProcessor(\n _posthog: PostHog,\n {\n organization,\n projectId,\n prefix,\n severityAllowList = ['error'],\n sendExceptionsToPostHog = true,\n }: SentryIntegrationOptions = {}\n): (event: _SentryEvent) => _SentryEvent {\n return (event) => {\n const shouldProcessLevel = severityAllowList === '*' || severityAllowList.includes(event.level as SeverityLevel)\n if (!shouldProcessLevel || !_posthog.__loaded) return event\n if (!event.tags) event.tags = {}\n\n const personUrl = _posthog.requestRouter.endpointFor(\n 'ui',\n `/project/${_posthog.config.token}/person/${_posthog.get_distinct_id()}`\n )\n event.tags['PostHog Person URL'] = personUrl\n if (_posthog.sessionRecordingStarted()) {\n event.tags['PostHog Recording URL'] = _posthog.get_session_replay_url({ withTimestamp: true })\n }\n\n const exceptions: _SentryException[] = event.exception?.values || []\n\n const exceptionList = exceptions.map((exception) => {\n return {\n ...exception,\n stacktrace: exception.stacktrace\n ? {\n ...exception.stacktrace,\n type: 'raw',\n frames: (exception.stacktrace.frames || []).map((frame: any) => {\n return { ...frame, platform: 'web:javascript' }\n }),\n }\n : undefined,\n }\n })\n\n const data: SentryExceptionProperties & {\n // two properties added to match any exception auto-capture\n // added manually to avoid any dependency on the lazily loaded content\n $exception_message: any\n $exception_type: any\n $exception_list: any\n $exception_level: SeverityLevel\n } = {\n // PostHog Exception Properties,\n $exception_message: exceptions[0]?.value || event.message,\n $exception_type: exceptions[0]?.type,\n $exception_level: event.level,\n $exception_list: exceptionList,\n // Sentry Exception Properties\n $sentry_event_id: event.event_id,\n $sentry_exception: event.exception,\n $sentry_exception_message: exceptions[0]?.value || event.message,\n $sentry_exception_type: exceptions[0]?.type,\n $sentry_tags: event.tags,\n }\n\n if (organization && projectId) {\n data['$sentry_url'] =\n (prefix || 'https://sentry.io/organizations/') +\n organization +\n '/issues/?project=' +\n projectId +\n '&query=' +\n event.event_id\n }\n\n if (sendExceptionsToPostHog) {\n _posthog.exceptions?.sendExceptionEvent(data)\n }\n\n return event\n }\n}\n\n// V8 integration - function based\nexport function sentryIntegration(_posthog: PostHog, options?: SentryIntegrationOptions): _SentryIntegration {\n const processor = createEventProcessor(_posthog, options)\n return {\n name: NAME,\n processEvent(event) {\n return processor(event)\n },\n }\n}\n// V7 integration - class based\nexport class SentryIntegration implements _SentryIntegrationClass {\n name: string\n\n setupOnce: (\n addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n getCurrentHub: () => _SentryHub\n ) => void\n\n constructor(\n _posthog: PostHog,\n organization?: string,\n projectId?: number,\n prefix?: string,\n severityAllowList?: SeverityLevel[] | '*',\n sendExceptionsToPostHog?: boolean\n ) {\n // setupOnce gets called by Sentry when it intializes the plugin\n this.name = NAME\n this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n addGlobalEventProcessor(\n createEventProcessor(_posthog, {\n organization,\n projectId,\n prefix,\n severityAllowList,\n sendExceptionsToPostHog: sendExceptionsToPostHog ?? true,\n })\n )\n }\n }\n}\n","import { window } from '@posthog/browser-common/utils/globals'\nimport { PostHog } from './posthog-core'\nimport { clampToRange, isUndefined } from '@posthog/core'\nimport { extend } from '@posthog/browser-common/utils/general-utils'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { SessionIdChangedCallback } from './types'\n\ninterface PageViewEventProperties {\n $pageview_id?: string\n $prev_pageview_id?: string\n $prev_pageview_pathname?: string\n $prev_pageview_duration?: number // seconds\n $prev_pageview_last_scroll?: number\n $prev_pageview_last_scroll_percentage?: number\n $prev_pageview_max_scroll?: number\n $prev_pageview_max_scroll_percentage?: number\n $prev_pageview_last_content?: number\n $prev_pageview_last_content_percentage?: number\n $prev_pageview_max_content?: number\n $prev_pageview_max_content_percentage?: number\n}\n\n// This keeps track of the PageView state (such as the previous PageView's path, timestamp, id, and scroll properties).\n// We store the state in memory, which means that for non-SPA sites, the state will be lost on page reload. This means\n// that non-SPA sites should always send a $pageleave event on any navigation, before the page unloads. For SPA sites,\n// they only need to send a $pageleave event when the user navigates away from the site, as the information is not lost\n// on an internal navigation, and is included as the $prev_pageview_ properties in the next $pageview event.\n\n// Practically, this means that to find the scroll properties for a given pageview, you need to find the event where\n// event name is $pageview or $pageleave and where $prev_pageview_id matches the original pageview event's id.\n\nexport class PageViewManager {\n _currentPageview?: { timestamp: Date; pageViewId: string | undefined; pathname: string | undefined }\n _instance: PostHog\n private _unsubscribeSessionId?: () => void\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._setupSessionRotationHandler()\n }\n\n private _setupSessionRotationHandler(): void {\n this._unsubscribeSessionId = this._instance.sessionManager?.onSessionId(this._onSessionIdChange)\n }\n\n private _onSessionIdChange: SessionIdChangedCallback = (sessionId, _windowId, changeReason) => {\n // Only act on actual session rotations, not initial session creation\n if (!changeReason) {\n return\n }\n\n // Clear state when session changes for any of these reasons:\n // - noSessionId: after posthog.reset() or forced idle reset\n // - activityTimeout: 30 min idle (default, configurable up to 10 hours)\n // - sessionPastMaximumLength: 24 hour max session\n // - crossTabAdoption: this tab adopted a rotation another tab already wrote\n if (\n changeReason.noSessionId ||\n changeReason.activityTimeout ||\n changeReason.sessionPastMaximumLength ||\n changeReason.crossTabAdoption\n ) {\n logger.info('[PageViewManager] Session rotated, clearing pageview state', {\n sessionId,\n changeReason,\n })\n this._currentPageview = undefined\n this._instance.scrollManager.resetContext()\n }\n }\n\n destroy(): void {\n this._unsubscribeSessionId?.()\n this._unsubscribeSessionId = undefined\n }\n\n doPageView(timestamp: Date, pageViewId?: string): PageViewEventProperties {\n const response = this._previousPageViewProperties(timestamp, pageViewId)\n\n // On a pageview we reset the contexts\n this._currentPageview = { pathname: window?.location.pathname ?? '', pageViewId, timestamp }\n this._instance.scrollManager.resetContext()\n\n return response\n }\n\n doPageLeave(timestamp: Date): PageViewEventProperties {\n return this._previousPageViewProperties(timestamp, this._currentPageview?.pageViewId)\n }\n\n doEvent(): PageViewEventProperties {\n return { $pageview_id: this._currentPageview?.pageViewId }\n }\n\n private _previousPageViewProperties(timestamp: Date, pageviewId: string | undefined): PageViewEventProperties {\n const previousPageView = this._currentPageview\n\n if (!previousPageView) {\n return { $pageview_id: pageviewId }\n }\n\n let properties: PageViewEventProperties = {\n $pageview_id: pageviewId,\n $prev_pageview_id: previousPageView.pageViewId,\n }\n\n const scrollContext = this._instance.scrollManager.getContext()\n\n if (scrollContext && !this._instance.config.disable_scroll_properties) {\n let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } =\n scrollContext\n\n if (\n !isUndefined(maxScrollHeight) &&\n !isUndefined(lastScrollY) &&\n !isUndefined(maxScrollY) &&\n !isUndefined(maxContentHeight) &&\n !isUndefined(lastContentY) &&\n !isUndefined(maxContentY)\n ) {\n // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n maxScrollHeight = Math.ceil(maxScrollHeight)\n lastScrollY = Math.ceil(lastScrollY)\n maxScrollY = Math.ceil(maxScrollY)\n maxContentHeight = Math.ceil(maxContentHeight)\n lastContentY = Math.ceil(lastContentY)\n maxContentY = Math.ceil(maxContentY)\n\n // if the maximum scroll height is near 0, then the percentage is 1\n const lastScrollPercentage =\n maxScrollHeight <= 1 ? 1 : clampToRange(lastScrollY / maxScrollHeight, 0, 1, logger)\n const maxScrollPercentage =\n maxScrollHeight <= 1 ? 1 : clampToRange(maxScrollY / maxScrollHeight, 0, 1, logger)\n const lastContentPercentage =\n maxContentHeight <= 1 ? 1 : clampToRange(lastContentY / maxContentHeight, 0, 1, logger)\n const maxContentPercentage =\n maxContentHeight <= 1 ? 1 : clampToRange(maxContentY / maxContentHeight, 0, 1, logger)\n\n properties = extend(properties, {\n $prev_pageview_last_scroll: lastScrollY,\n $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n $prev_pageview_max_scroll: maxScrollY,\n $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n $prev_pageview_last_content: lastContentY,\n $prev_pageview_last_content_percentage: lastContentPercentage,\n $prev_pageview_max_content: maxContentY,\n $prev_pageview_max_content_percentage: maxContentPercentage,\n })\n }\n }\n\n if (previousPageView.pathname) {\n properties.$prev_pageview_pathname = previousPageView.pathname\n }\n if (previousPageView.timestamp) {\n // Use seconds, for consistency with our other duration-related properties like $duration\n properties.$prev_pageview_duration = (timestamp.getTime() - previousPageView.timestamp.getTime()) / 1000\n }\n\n return properties\n }\n}\n","import type { Properties } from './types'\n\nimport { isObject } from '@posthog/core'\n\nexport const transformEnabledFeatureFlagsToEventProperties = (value: Properties | undefined): Properties => {\n if (!isObject(value)) {\n return {}\n }\n\n const eventProperties: Properties = {}\n const keys = Object.keys(value)\n for (let i = 0; i < keys.length; i++) {\n eventProperties[`$feature/${keys[i]}`] = value[keys[i]]\n }\n return eventProperties\n}\n","import {\n ALIAS_ID_KEY,\n AUTOCAPTURE_DISABLED_SERVER_SIDE,\n CAMPAIGN_IDS_KEY,\n CAPTURE_RATE_LIMIT,\n CLIENT_SESSION_PROPS,\n CONVERSATIONS_LEGACY_TICKET_ID,\n CONVERSATIONS_LEGACY_USER_TRAITS,\n CONVERSATIONS_LEGACY_WIDGET_SESSION_ID,\n CONVERSATIONS_LEGACY_WIDGET_STATE,\n DEAD_CLICKS_ENABLED_SERVER_SIDE,\n ENABLE_PERSON_PROCESSING,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n EVENT_TIMERS_KEY,\n EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE,\n FLAG_CALL_REPORTED,\n FLAG_CALL_REPORTED_SESSION_ID,\n HEATMAPS_ENABLED_SERVER_SIDE,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_PERSON_INFO,\n INITIAL_REFERRER_INFO,\n PEOPLE_DISTINCT_ID_KEY,\n PERSISTENCE_ACTIVE_FEATURE_FLAGS,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n PERSISTENCE_FEATURE_FLAG_PAYLOADS,\n PERSISTENCE_FEATURE_FLAG_REQUEST_ID,\n PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS,\n PERSISTENCE_OVERRIDE_FEATURE_FLAGS,\n PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS,\n PRODUCT_TOURS,\n PRODUCT_TOURS_ACTIVATED,\n PRODUCT_TOURS_ACTIVATED_SESSION,\n PRODUCT_TOURS_ENABLED_SERVER_SIDE,\n SDK_DEBUG_EXTENSIONS_INIT_METHOD,\n SDK_DEBUG_EXTENSIONS_INIT_TIME_MS,\n SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED,\n SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS,\n SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS,\n SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS,\n SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG,\n SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT,\n SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS,\n SESSION_ID,\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_START_REASON,\n SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP,\n SESSION_RECORDING_FLUSHED_SIZE,\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_PAST_MINIMUM_DURATION,\n SESSION_RECORDING_SAMPLE_RATE,\n SESSION_RECORDING_REMOTE_CONFIG,\n SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX,\n SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n SURVEYS_ACTIVATED,\n SURVEYS_ACTIVATED_SESSION,\n SURVEYS_LOADED_AT,\n USER_STATE,\n WEB_VITALS_ALLOWED_METRICS,\n WEB_VITALS_ENABLED_SERVER_SIDE,\n} from './constants'\nimport { transformEnabledFeatureFlagsToEventProperties } from './persistence-key-transforms'\nimport type { Properties, Property } from './types'\nimport { isNull } from '@posthog/core'\n\n/**\n * - `event`: include the stored key/value on captured events as-is.\n * - `hidden`: keep the key in persistence only; never expose it on captured events.\n * - `derived`: do not expose the stored key directly, but derive one or more event properties from its value.\n * For example, `ENABLED_FEATURE_FLAGS` is stored as `$enabled_feature_flags`, but exposed on events as\n * `$feature/<flag-key>` properties via `transformToEventProperties`.\n */\nexport type PersistenceKeyExposure = 'event' | 'hidden' | 'derived'\n\n/**\n * Keys sharing a `storageGroup` are persisted together in their own storage\n * entry (`<name>__<group>`) instead of the main persistence blob, when the\n * `split_storage` config is enabled. Keys without a group\n * stay in the main blob. Members of one group are written in a single entry so\n * an atomic `register` of the whole group lands as one write (no torn state).\n */\nexport type PersistenceStorageGroup = 'flags' | 'surveys'\n\nexport const PERSISTENCE_STORAGE_GROUPS: readonly PersistenceStorageGroup[] = ['flags', 'surveys']\n\ninterface PersistenceKeyPolicyEntry {\n exposure: PersistenceKeyExposure\n storageGroup?: PersistenceStorageGroup\n /**\n * Per-request metadata that changes on every remote load even when the\n * meaningful content is unchanged. A volatile key never marks its storage\n * group dirty and is excluded from the group fingerprint, so a\n * volatile-only change does not rewrite — and cross-tab re-broadcast — a\n * large group entry. The freshest value rides along on the next content\n * write; the on-disk copy may lag in-memory until then.\n */\n volatile?: boolean\n shouldSkipFromEventProperties?: (value: Property, shouldSkip: () => boolean) => boolean\n transformToEventProperties?: (value: Property) => Properties\n}\n\nexport const PERSISTENCE_KEY_POLICY: Record<string, PersistenceKeyPolicyEntry> = {\n [PEOPLE_DISTINCT_ID_KEY]: { exposure: 'hidden' },\n [ALIAS_ID_KEY]: { exposure: 'hidden' },\n [CAMPAIGN_IDS_KEY]: { exposure: 'hidden' },\n [EVENT_TIMERS_KEY]: { exposure: 'hidden' },\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: { exposure: 'event' },\n [HEATMAPS_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n [EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n [ERROR_TRACKING_SUPPRESSION_RULES]: { exposure: 'hidden' },\n [ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS]: { exposure: 'event' },\n [WEB_VITALS_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n [DEAD_CLICKS_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n [PRODUCT_TOURS_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n [WEB_VITALS_ALLOWED_METRICS]: { exposure: 'event' },\n [SESSION_RECORDING_REMOTE_CONFIG]: { exposure: 'hidden' },\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n [SESSION_ID]: { exposure: 'hidden' },\n [SESSION_RECORDING_IS_SAMPLED]: { exposure: 'event' },\n [SESSION_RECORDING_SAMPLE_RATE]: {\n exposure: 'event',\n shouldSkipFromEventProperties: (value) => isNull(value),\n },\n [SESSION_RECORDING_PAST_MINIMUM_DURATION]: { exposure: 'event' },\n [SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION]: { exposure: 'event' },\n [SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION]: { exposure: 'event' },\n [SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP]: { exposure: 'event' },\n [SESSION_RECORDING_FLUSHED_SIZE]: { exposure: 'hidden' },\n [ENABLED_FEATURE_FLAGS]: {\n exposure: 'derived',\n storageGroup: 'flags',\n shouldSkipFromEventProperties: (_, shouldSkip) => shouldSkip(),\n transformToEventProperties: transformEnabledFeatureFlagsToEventProperties,\n },\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: { exposure: 'event', storageGroup: 'flags' },\n [PERSISTENCE_EARLY_ACCESS_FEATURES]: { exposure: 'hidden' },\n [PERSISTENCE_FEATURE_FLAG_DETAILS]: { exposure: 'hidden', storageGroup: 'flags' },\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: { exposure: 'event', storageGroup: 'flags' },\n [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: { exposure: 'event', storageGroup: 'flags', volatile: true },\n // Server gate for minimal $feature_flag_called events — internal state that must never\n // leak into event properties.\n [PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS]: { exposure: 'hidden', storageGroup: 'flags' },\n [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: { exposure: 'event' },\n [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: { exposure: 'hidden' },\n [STORED_PERSON_PROPERTIES_KEY]: { exposure: 'hidden' },\n [STORED_GROUP_PROPERTIES_KEY]: { exposure: 'hidden' },\n [SURVEYS]: { exposure: 'hidden', storageGroup: 'surveys' },\n [SURVEYS_LOADED_AT]: { exposure: 'hidden', storageGroup: 'surveys', volatile: true },\n [SURVEYS_ACTIVATED]: { exposure: 'event' },\n [SURVEYS_ACTIVATED_SESSION]: { exposure: 'hidden' },\n [PRODUCT_TOURS]: { exposure: 'hidden' },\n [PRODUCT_TOURS_ACTIVATED]: { exposure: 'hidden' },\n [PRODUCT_TOURS_ACTIVATED_SESSION]: { exposure: 'hidden' },\n [CONVERSATIONS_LEGACY_WIDGET_SESSION_ID]: { exposure: 'event' },\n [CONVERSATIONS_LEGACY_TICKET_ID]: { exposure: 'event' },\n [CONVERSATIONS_LEGACY_WIDGET_STATE]: { exposure: 'event' },\n [CONVERSATIONS_LEGACY_USER_TRAITS]: { exposure: 'event' },\n [FLAG_CALL_REPORTED]: { exposure: 'hidden' },\n [FLAG_CALL_REPORTED_SESSION_ID]: { exposure: 'hidden' },\n [PERSISTENCE_FEATURE_FLAG_ERRORS]: { exposure: 'hidden' },\n [PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]: { exposure: 'hidden', storageGroup: 'flags', volatile: true },\n [USER_STATE]: { exposure: 'hidden' },\n [CLIENT_SESSION_PROPS]: { exposure: 'hidden' },\n [CAPTURE_RATE_LIMIT]: { exposure: 'hidden' },\n [INITIAL_CAMPAIGN_PARAMS]: { exposure: 'hidden' },\n [INITIAL_REFERRER_INFO]: { exposure: 'hidden' },\n [INITIAL_PERSON_INFO]: { exposure: 'hidden' },\n [ENABLE_PERSON_PROCESSING]: { exposure: 'hidden' },\n [SESSION_RECORDING_OVERRIDE_SAMPLING]: { exposure: 'event' },\n [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: { exposure: 'event' },\n [SESSION_RECORDING_OVERRIDE_URL_TRIGGER]: { exposure: 'event' },\n [SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: { exposure: 'event' },\n [SDK_DEBUG_EXTENSIONS_INIT_METHOD]: { exposure: 'event' },\n [SDK_DEBUG_EXTENSIONS_INIT_TIME_MS]: { exposure: 'event' },\n [SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT]: { exposure: 'event' },\n [SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS]: { exposure: 'event' },\n [SESSION_RECORDING_START_REASON]: { exposure: 'event' },\n}\n\nconst PERSISTENCE_KEY_PREFIX_POLICY: Array<[string, PersistenceKeyPolicyEntry]> = [\n [SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX, { exposure: 'hidden' }],\n [SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX, { exposure: 'hidden' }],\n [SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX, { exposure: 'hidden' }],\n]\n\nexport const getPersistenceKeyPolicy = (key: string): PersistenceKeyPolicyEntry | undefined => {\n const exactMatch = PERSISTENCE_KEY_POLICY[key]\n if (exactMatch) {\n return exactMatch\n }\n\n for (const [prefix, policy] of PERSISTENCE_KEY_PREFIX_POLICY) {\n if (key.indexOf(prefix) === 0) {\n return policy\n }\n }\n\n return undefined\n}\n","import { isArray, isFile, isUndefined, safeJsonStringify } from \"@posthog/core\";\nimport { each } from \"./general-utils.mjs\";\nimport { document as external_globals_mjs_document, isBrowserOnline, location as external_globals_mjs_location } from \"./globals.mjs\";\nimport { logger } from \"./logger.mjs\";\nconst localDomains = [\n 'localhost',\n '127.0.0.1'\n];\nconst jsonStringify = (data, space)=>{\n try {\n return JSON.stringify(data, (_, value)=>'bigint' == typeof value ? value.toString() : value, space);\n } catch {\n return safeJsonStringify(data);\n }\n};\nconst convertToURL = (url)=>{\n const location = external_globals_mjs_document?.createElement('a');\n if (isUndefined(location)) return null;\n location.href = url;\n return location;\n};\nconst formDataToQuery = function(formdata, arg_separator = '&') {\n let use_val;\n let use_key;\n const tph_arr = [];\n each(formdata, function(val, key) {\n if (isUndefined(val) || isUndefined(key) || 'undefined' === key) return;\n use_val = encodeURIComponent(isFile(val) ? val.name : val.toString());\n use_key = encodeURIComponent(key);\n tph_arr[tph_arr.length] = use_key + '=' + use_val;\n });\n return tph_arr.join(arg_separator);\n};\nconst getQueryParam = function(url, param) {\n const withoutHash = url.split('#')[0] || '';\n const queryParams = withoutHash.split(/\\?(.*)/)[1] || '';\n const cleanedQueryParams = queryParams.replace(/^\\?+/g, '');\n const queryParts = cleanedQueryParams.split('&');\n let keyValuePair;\n for(let i = 0; i < queryParts.length; i++){\n const parts = queryParts[i].split('=');\n if (parts[0] === param) {\n keyValuePair = parts;\n break;\n }\n }\n if (!isArray(keyValuePair) || keyValuePair.length < 2) return '';\n {\n let result = keyValuePair[1];\n try {\n result = decodeURIComponent(result);\n } catch {\n logger.error('Skipping decoding for malformed query param: ' + result);\n }\n return result.replace(/\\+/g, ' ');\n }\n};\nconst maskQueryParams = function(url, maskedParams, mask) {\n if (!url || !maskedParams || !maskedParams.length) return url;\n const splitHash = url.split('#');\n const withoutHash = splitHash[0] || '';\n const hash = splitHash[1];\n const splitQuery = withoutHash.split('?');\n const queryString = splitQuery[1];\n const urlWithoutQueryAndHash = splitQuery[0];\n const queryParts = (queryString || '').split('&');\n const paramStrings = [];\n for(let i = 0; i < queryParts.length; i++){\n const keyValuePair = queryParts[i].split('=');\n if (isArray(keyValuePair)) if (maskedParams.includes(keyValuePair[0])) paramStrings.push(keyValuePair[0] + '=' + mask);\n else paramStrings.push(queryParts[i]);\n }\n let result = urlWithoutQueryAndHash;\n if (null != queryString) result += '?' + paramStrings.join('&');\n if (null != hash) result += '#' + hash;\n return result;\n};\nconst _getHashParam = function(hash, param) {\n const matches = hash.match(new RegExp(param + '=([^&]*)'));\n return matches ? matches[1] : null;\n};\nconst isLocalhost = ()=>localDomains.includes(external_globals_mjs_location.hostname);\nconst isStatusZeroFailureCircuitBreakerTripped = (consecutiveStatusZeroFailures, maxConsecutiveStatusZeroFailures)=>consecutiveStatusZeroFailures >= maxConsecutiveStatusZeroFailures && isBrowserOnline();\nconst updateStatusZeroFailureCount = (statusCode, consecutiveStatusZeroFailures, maxConsecutiveStatusZeroFailures, onCircuitBreakerTripped)=>{\n if (0 === statusCode) {\n if (isBrowserOnline()) {\n const updatedConsecutiveStatusZeroFailures = consecutiveStatusZeroFailures + 1;\n if (updatedConsecutiveStatusZeroFailures === maxConsecutiveStatusZeroFailures) onCircuitBreakerTripped();\n return updatedConsecutiveStatusZeroFailures;\n }\n return consecutiveStatusZeroFailures;\n }\n return 0;\n};\nexport { _getHashParam, convertToURL, formDataToQuery, getQueryParam, isLocalhost, isStatusZeroFailureCircuitBreakerTripped, jsonStringify, maskQueryParams, updateStatusZeroFailureCount };\n","import { convertToURL, getQueryParam, maskQueryParams } from \"./request-utils.mjs\";\nimport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS, isNull, isUndefined, stripLeadingDollar, stripUrlHash } from \"@posthog/core\";\nimport config from \"../config.mjs\";\nimport { SDK_DIST_CHANNEL } from \"../constants.mjs\";\nimport { each, extend, stripEmptyProperties } from \"./general-utils.mjs\";\nimport { document as external_globals_mjs_document, location as external_globals_mjs_location, userAgent, window as external_globals_mjs_window } from \"./globals.mjs\";\nimport { getCookieValue } from \"./cookie-utils.mjs\";\nconst URL_REGEX_PREFIX = 'https?://(.*)';\nconst PERSONAL_DATA_CAMPAIGN_PARAMS = [\n 'gclid',\n 'gclsrc',\n 'dclid',\n 'gbraid',\n 'wbraid',\n 'fbclid',\n 'msclkid',\n 'twclid',\n 'li_fat_id',\n 'igshid',\n 'ttclid',\n 'rdt_cid',\n 'epik',\n 'qclid',\n 'sccid',\n 'irclid',\n '_kx'\n];\nconst CAMPAIGN_PARAMS = [\n 'utm_source',\n 'utm_medium',\n 'utm_campaign',\n 'utm_content',\n 'utm_term',\n 'gad_source',\n 'mc_cid',\n ...PERSONAL_DATA_CAMPAIGN_PARAMS\n];\nconst EVENT_TO_PERSON_PROPERTIES = [\n '$app_build',\n '$app_name',\n '$app_namespace',\n '$app_version',\n '$browser',\n '$browser_version',\n '$device_type',\n '$current_url',\n '$pathname',\n '$os',\n '$os_name',\n '$os_version',\n '$referring_domain',\n '$referrer',\n '$screen_height',\n '$screen_width',\n '$viewport_height',\n '$viewport_width',\n '$raw_user_agent'\n];\nconst MASKED = '<masked>';\nconst COOKIE_CAMPAIGN_PARAMS = [\n 'li_fat_id'\n];\nfunction getCampaignParams(customTrackedParams, maskPersonalDataProperties, customPersonalDataProperties) {\n if (!external_globals_mjs_document) return {};\n const paramsToMask = maskPersonalDataProperties ? [\n ...PERSONAL_DATA_CAMPAIGN_PARAMS,\n ...customPersonalDataProperties || []\n ] : [];\n const urlCampaignParams = _getCampaignParamsFromUrl(maskQueryParams(external_globals_mjs_document.URL, paramsToMask, MASKED), customTrackedParams);\n const cookieCampaignParams = _getCampaignParamsFromCookie();\n return extend(cookieCampaignParams, urlCampaignParams);\n}\nfunction _getCampaignParamsFromUrl(url, customParams) {\n const campaign_keywords = CAMPAIGN_PARAMS.concat(customParams || []);\n const params = {};\n each(campaign_keywords, function(kwkey) {\n const kw = getQueryParam(url, kwkey);\n params[kwkey] = kw ? kw : null;\n });\n return params;\n}\nfunction _getCampaignParamsFromCookie() {\n const params = {};\n each(COOKIE_CAMPAIGN_PARAMS, function(kwkey) {\n const kw = getCookieValue(kwkey);\n params[kwkey] = kw ? kw : null;\n });\n return params;\n}\nfunction _getSearchEngine(referrer) {\n if (!referrer) return null;\n if (0 === referrer.search(URL_REGEX_PREFIX + 'google.([^/?]*)')) return 'google';\n if (0 === referrer.search(URL_REGEX_PREFIX + 'bing.com')) return 'bing';\n if (0 === referrer.search(URL_REGEX_PREFIX + 'yahoo.com')) return 'yahoo';\n if (0 === referrer.search(URL_REGEX_PREFIX + 'duckduckgo.com')) return 'duckduckgo';\n else return null;\n}\nfunction _getSearchInfoFromReferrer(referrer) {\n const search = _getSearchEngine(referrer);\n const param = 'yahoo' != search ? 'q' : 'p';\n const ret = {};\n if (!isNull(search)) {\n ret['$search_engine'] = search;\n const keyword = external_globals_mjs_document ? getQueryParam(external_globals_mjs_document.referrer, param) : '';\n if (keyword.length) ret['ph_keyword'] = keyword;\n }\n return ret;\n}\nfunction getSearchInfo() {\n const referrer = external_globals_mjs_document?.referrer;\n if (!referrer) return {};\n return _getSearchInfoFromReferrer(referrer);\n}\nfunction getBrowserLanguage() {\n return navigator.language || navigator.userLanguage;\n}\nfunction getBrowserLanguagePrefix() {\n const lang = getBrowserLanguage();\n return 'string' == typeof lang ? lang.split('-')[0] : void 0;\n}\nconst DIRECT = '$direct';\nfunction getReferrer() {\n return external_globals_mjs_document?.referrer || DIRECT;\n}\nfunction getReferringDomain() {\n if (!external_globals_mjs_document?.referrer) return DIRECT;\n return convertToURL(external_globals_mjs_document.referrer)?.host || DIRECT;\n}\nfunction getReferrerInfo() {\n return {\n $referrer: getReferrer(),\n $referring_domain: getReferringDomain()\n };\n}\nfunction getPersonInfo(maskPersonalDataProperties, customPersonalDataProperties, disableCaptureUrlHashes = false) {\n const paramsToMask = maskPersonalDataProperties ? [\n ...PERSONAL_DATA_CAMPAIGN_PARAMS,\n ...customPersonalDataProperties || []\n ] : [];\n const href = disableCaptureUrlHashes ? stripUrlHash(external_globals_mjs_location?.href) : external_globals_mjs_location?.href;\n const url = href?.substring(0, 1000);\n return {\n r: getReferrer().substring(0, 1000),\n u: url ? maskQueryParams(url, paramsToMask, MASKED) : void 0\n };\n}\nfunction getPersonPropsFromInfo(info, disableCaptureUrlHashes = false) {\n const { r: referrer, u } = info;\n const url = disableCaptureUrlHashes ? stripUrlHash(u) : u;\n const referring_domain = null == referrer ? void 0 : referrer == DIRECT ? DIRECT : convertToURL(referrer)?.host;\n const props = {\n $referrer: referrer,\n $referring_domain: referring_domain\n };\n if (url) {\n props['$current_url'] = url;\n const location = convertToURL(url);\n props['$host'] = location?.host;\n props['$pathname'] = location?.pathname;\n const campaignParams = _getCampaignParamsFromUrl(url);\n extend(props, campaignParams);\n }\n if (referrer) {\n const searchInfo = _getSearchInfoFromReferrer(referrer);\n extend(props, searchInfo);\n }\n return props;\n}\nfunction getInitialPersonPropsFromInfo(info, disableCaptureUrlHashes = false) {\n const personProps = getPersonPropsFromInfo(info, disableCaptureUrlHashes);\n const props = {};\n each(personProps, function(val, key) {\n props[`$initial_${stripLeadingDollar(key)}`] = val;\n });\n return props;\n}\nfunction getTimezone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return;\n }\n}\nfunction getTimezoneOffset() {\n try {\n return new Date().getTimezoneOffset();\n } catch {\n return;\n }\n}\nfunction getBrowserDetectionHints() {\n const nav = 'undefined' != typeof navigator ? navigator : void 0;\n return nav?.brave ? {\n brave: true\n } : {};\n}\nfunction getEventProperties(maskPersonalDataProperties, customPersonalDataProperties, detectGoogleSearchApp, disableCaptureUrlHashes = false) {\n if (!userAgent) return {};\n const paramsToMask = maskPersonalDataProperties ? [\n ...PERSONAL_DATA_CAMPAIGN_PARAMS,\n ...customPersonalDataProperties || []\n ] : [];\n const [os_name, os_version] = detectOS(userAgent);\n const browserHints = getBrowserDetectionHints();\n const browserOptions = {};\n if (!isUndefined(detectGoogleSearchApp)) browserOptions.detectGoogleSearchApp = detectGoogleSearchApp;\n const deviceOptions = {};\n const userAgentDataPlatform = navigator?.userAgentData?.platform;\n const maxTouchPoints = navigator?.maxTouchPoints;\n const screenWidth = external_globals_mjs_window?.screen?.width;\n const screenHeight = external_globals_mjs_window?.screen?.height;\n const devicePixelRatio = external_globals_mjs_window?.devicePixelRatio;\n if (!isUndefined(userAgentDataPlatform)) deviceOptions.userAgentDataPlatform = userAgentDataPlatform;\n if (!isUndefined(maxTouchPoints)) deviceOptions.maxTouchPoints = maxTouchPoints;\n if (!isUndefined(screenWidth)) deviceOptions.screenWidth = screenWidth;\n if (!isUndefined(screenHeight)) deviceOptions.screenHeight = screenHeight;\n if (!isUndefined(devicePixelRatio)) deviceOptions.devicePixelRatio = devicePixelRatio;\n const properties = extend(stripEmptyProperties({\n $os: os_name,\n $os_version: os_version,\n $browser: detectBrowser(userAgent, navigator.vendor, browserHints, browserOptions),\n $device: detectDevice(userAgent),\n $device_type: detectDeviceType(userAgent, deviceOptions),\n $timezone: getTimezone(),\n $timezone_offset: getTimezoneOffset()\n }), {\n $current_url: maskQueryParams(disableCaptureUrlHashes ? stripUrlHash(external_globals_mjs_location?.href) : external_globals_mjs_location?.href, paramsToMask, MASKED),\n $host: external_globals_mjs_location?.host,\n $pathname: external_globals_mjs_location?.pathname,\n $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n $browser_version: detectBrowserVersion(userAgent, navigator.vendor, browserHints, browserOptions),\n $browser_language: getBrowserLanguage(),\n $browser_language_prefix: getBrowserLanguagePrefix(),\n $screen_height: external_globals_mjs_window?.screen.height,\n $screen_width: external_globals_mjs_window?.screen.width,\n $viewport_height: external_globals_mjs_window?.innerHeight,\n $viewport_width: external_globals_mjs_window?.innerWidth,\n $lib: config.LIB_NAME,\n $lib_version: config.LIB_VERSION,\n $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n $time: Date.now() / 1000\n });\n if (config.SDK_DIST_CHANNEL) properties[SDK_DIST_CHANNEL] = config.SDK_DIST_CHANNEL;\n return properties;\n}\nexport { CAMPAIGN_PARAMS, COOKIE_CAMPAIGN_PARAMS, EVENT_TO_PERSON_PROPERTIES, MASKED, PERSONAL_DATA_CAMPAIGN_PARAMS, getBrowserDetectionHints, getBrowserLanguage, getBrowserLanguagePrefix, getCampaignParams, getEventProperties, getInitialPersonPropsFromInfo, getPersonInfo, getPersonPropsFromInfo, getReferrer, getReferrerInfo, getReferringDomain, getSearchInfo, getTimezone, getTimezoneOffset };\n","/* eslint camelcase: \"off\" */\n\nimport { each, extend, stripEmptyProperties, addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { cookieStore, createLocalPlusCookieStore, localStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport {\n ENABLED_FEATURE_FLAGS,\n EVENT_TIMERS_KEY,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_PERSON_INFO,\n INITIAL_REFERRER_INFO,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n SURVEYS_LOADED_AT,\n} from './constants'\nimport { getPersistenceKeyPolicy, PERSISTENCE_STORAGE_GROUPS, PersistenceStorageGroup } from './persistence-key-policy'\n\n// The \"freshness\" key each split group stamps when its server payload is\n// (re)loaded. A group entry carrying an older timestamp than the main blob is a\n// stale orphan (a gate-off / older-SDK tab wrote a fresher payload back to main)\n// and must not win on load. Groups without an entry here have no freshness\n// signal, so the group entry wins by default (the migrated-forward home).\nconst VOLATILE_FINGERPRINT_PLACEHOLDER = '__volatile__'\n\n// Both freshness keys are volatile (their on-disk value lags the last content\n// change). That is safe: when only the stamp moved, both the group entry and the\n// main blob hold identical content, so whichever side wins still produces the\n// same values. A mixed-fleet race at most causes one extra /flags cycle.\nconst GROUP_FRESHNESS_KEY: Partial<Record<PersistenceStorageGroup, string>> = {\n flags: PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n surveys: SURVEYS_LOADED_AT,\n}\n\nimport { isNumber, isUndefined } from '@posthog/core'\nimport {\n getCampaignParams,\n getInitialPersonPropsFromInfo,\n getPersonInfo,\n getReferrerInfo,\n getSearchInfo,\n} from '@posthog/browser-common/utils/event-utils'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { stripLeadingDollar, isEmptyObject, isObject } from '@posthog/core'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n 'cookie',\n 'localstorage',\n 'localstorage+cookie',\n 'sessionstorage',\n 'memory',\n]\n\nconst parseName = (config: PostHogConfig): string => {\n let token = ''\n if (config['token']) {\n token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n }\n\n if (config['persistence_name']) {\n return 'ph_' + config['persistence_name']\n } else {\n return 'ph_' + token + '_posthog'\n }\n}\n\n// Fingerprint slot for the main persistence entry. Group entries (`flags`)\n// use their group name as the slot. See `_writeEntry`.\nconst MAIN_STORAGE_SLOT = 'main'\n\ntype StorageSlot = PersistenceStorageGroup | typeof MAIN_STORAGE_SLOT\n\n// Per-entry write bookkeeping (see `PostHogPersistence._slotState`).\ninterface SlotWriteState {\n // Serialized snapshot of the last confirmed-successful write to this entry;\n // a save that reproduces it is skipped (no-op rejection — writing identical\n // bytes still fires a cross-tab `storage` broadcast). Undefined until the\n // first successful write.\n fingerprint?: string\n // A prop in this group changed since its last successful write, so the large\n // flag/survey payload is re-serialized on the next save. Group slots only —\n // the main slot always serializes (small, and carries cookie options).\n dirty?: boolean\n // This group entry has materialized on disk this session (loaded at startup\n // or written since), so `_writeNowSplit` writes it through even when empty to\n // clear a stale on-disk entry. Recorded only after a confirmed write.\n persisted?: boolean\n}\n\nconst isArrayContentsEqual = (arr1: readonly string[], arr2: readonly string[]): boolean => {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n const sortedArr1 = [...arr1].sort()\n const sortedArr2 = [...arr2].sort()\n return sortedArr1.every((item, index) => item === sortedArr2[index])\n}\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n private _config: PostHogConfig\n props: Properties\n private _storage: PersistentStore\n private _campaign_params_saved: boolean\n private readonly _name: string\n _disabled: boolean | undefined\n private _secure: boolean | undefined\n private _expire_days: number | undefined\n private _default_expiry: number | undefined\n private _cross_subdomain: boolean | undefined\n // Per-storage-entry write bookkeeping, keyed by slot (`main` plus each group\n // name): no-op-rejection fingerprint, per-group dirty flag, and on-disk\n // materialization. Reset wholesale on remove()/clear() so a save after\n // remove always lands. See `SlotWriteState`.\n private _slotState: Partial<Record<StorageSlot, SlotWriteState>> = {}\n // Whether the resolved storage backend can host the split (localStorage /\n // localStorage+cookie). Set by `_buildStorage`.\n private _splitStorageEligible = false\n // Whether flag config is stored in their own entries this session:\n // backend-eligible AND `split_storage` enabled.\n // Re-resolved on every `update_config` (backend rebuild or a runtime flag flip).\n private _splitStorage = false\n // Whether this instance owns (and may clean up) the shared split group\n // entries. The localStorage primary owns them; the sessionStorage sibling\n // posthog-core spins up shares the primary's storage name, so it must not\n // remove them — otherwise its remove() (fired via set_secure on every\n // set_config reconstruction) would wipe the primary's __flags entry.\n private readonly _ownsSplitStorage: boolean\n // Optional debounce: when `persistence_save_debounce_ms` is > 0, rapid\n // calls to `save()` are coalesced into one write at the end of the\n // window. The in-memory `props` is always updated synchronously, so\n // in-tab reads see the latest values regardless. Pending writes are\n // flushed on `beforeunload` and `pagehide` so no state is lost on\n // tab close.\n private _pendingSaveTimer: ReturnType<typeof setTimeout> | undefined\n\n /**\n * @param {PostHogConfig} config initial PostHog configuration\n * @param {boolean=} isDisabled should persistence be disabled (e.g. because of consent management)\n */\n constructor(config: PostHogConfig, isDisabled?: boolean, ownsSplitStorage: boolean = true) {\n this._config = config\n this._ownsSplitStorage = ownsSplitStorage\n this.props = {}\n this._campaign_params_saved = false\n this._name = parseName(config)\n this._storage = this._buildStorage(config)\n this._splitStorage = this._resolveSplitStorage(config)\n this.load()\n if (config.debug) {\n logger.info('Persistence loaded', config['persistence'], { ...this.props })\n }\n this.update_config(config, config, isDisabled)\n this.save()\n\n // Install unload flush listeners unconditionally. They are a no-op\n // when no debounced write is pending (see `flush()`), so it is safe\n // to install even when `persistence_save_debounce_ms` is 0 at\n // construction. Crucially this also handles `posthog.set_config({\n // persistence_save_debounce_ms: 250 })` enabling debounce later —\n // we'd otherwise miss the listener install and lose pending writes\n // on close.\n if (window) {\n const flush = (): void => this.flush()\n addEventListener(window, 'beforeunload', flush as EventListener, { capture: false })\n addEventListener(window, 'pagehide', flush as EventListener, { capture: false })\n }\n }\n\n private _saveDebounceMs(): number {\n const value = this._config?.persistence_save_debounce_ms\n return isNumber(value) && value > 0 ? value : 0\n }\n\n /**\n * Returns whether persistence is disabled. Only available in SDKs > 1.257.1. Do not use on extensions, otherwise\n * it'll break backwards compatibility for any version before 1.257.1.\n */\n public isDisabled?(): boolean {\n return !!this._disabled\n }\n\n private _buildStorage(config: PostHogConfig) {\n if (\n CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n ) === -1\n ) {\n logger.critical(\n 'Unknown persistence type ' + config['persistence'] + '; falling back to localStorage+cookie'\n )\n config['persistence'] = 'localStorage+cookie'\n }\n\n // Create this before hand to avoid creating it multiple times\n // Creating it inside each individual condition below is too complicated and will break backwards compatibility\n // so create it once for this specific config and use it if necessary\n const localPlusCookieStore = createLocalPlusCookieStore(\n config['cookie_persisted_properties'] || [],\n config['__preview_cookie_wins_on_conflict'] || false\n )\n\n let store: PersistentStore\n\n // The flag split is only meaningful on a localStorage-backed\n // store: it is the one that broadcasts large cross-tab `storage` events.\n // cookie can't hold the cluster, memory/sessionStorage don't broadcast.\n let splitEligible = false\n\n // We handle storage type in a case-insensitive way for backwards compatibility\n const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n if (storage_type === 'localstorage' && localStore._is_supported()) {\n store = localStore\n splitEligible = true\n } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore._is_supported()) {\n store = localPlusCookieStore\n splitEligible = true\n } else if (storage_type === 'sessionstorage' && sessionStore._is_supported()) {\n store = sessionStore\n } else if (storage_type === 'memory') {\n store = memoryStore\n } else if (storage_type === 'cookie') {\n store = cookieStore\n } else if (localPlusCookieStore._is_supported()) {\n // selected storage type wasn't supported, fallback to 'localstorage+cookie' if possible\n store = localPlusCookieStore\n splitEligible = true\n } else {\n store = cookieStore\n }\n\n this._splitStorageEligible = splitEligible\n return store\n }\n\n private _groupEntryName(group: PersistenceStorageGroup): string {\n return `${this._name}__${group}`\n }\n\n // The split is on only when the resolved backend can host it (localStorage /\n // localStorage+cookie, set by `_buildStorage` into `_splitStorageEligible`)\n // AND the config opts in. Resolved here so the constructor and the runtime\n // `update_config` toggle can never disagree about whether the split is active.\n private _resolveSplitStorage(config: PostHogConfig): boolean {\n return this._splitStorageEligible && !!config['split_storage']\n }\n\n /**\n * Check if the feature flag cache is stale based on the configured TTL.\n * @param ttl Optional TTL override (uses config value if not provided)\n * @internal\n */\n _isFeatureFlagCacheStale(ttl?: number): boolean {\n const effectiveTtl = ttl ?? this._config.feature_flag_cache_ttl_ms\n if (!effectiveTtl || effectiveTtl <= 0) {\n return false\n }\n const evaluatedAt = this.props[PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]\n // If evaluatedAt is missing or not a numeric timestamp, consider cache stale.\n // This handles SDK upgrades where old cached flags lack evaluatedAt.\n if (!evaluatedAt || typeof evaluatedAt !== 'number') {\n return true\n }\n return Date.now() - evaluatedAt > effectiveTtl\n }\n\n properties(): Properties {\n const p: Properties = {}\n\n each(this.props, (v, k) => {\n const policy = getPersistenceKeyPolicy(k)\n\n if (policy?.exposure === 'derived') {\n const shouldSkip = k === ENABLED_FEATURE_FLAGS ? () => this._isFeatureFlagCacheStale() : () => false\n\n if (policy.shouldSkipFromEventProperties?.(v, shouldSkip)) {\n return\n }\n\n if (policy.transformToEventProperties) {\n extend(p, policy.transformToEventProperties(v))\n }\n } else if (!policy || policy.exposure === 'event') {\n if (policy?.shouldSkipFromEventProperties?.(v, () => false)) {\n return\n }\n\n // Unknown keys are treated as user-defined super properties and remain event-visible.\n p[k] = v\n }\n })\n return p\n }\n\n load(): void {\n if (this._disabled) {\n return\n }\n\n const entry = this._storage._parse(this._name)\n\n if (entry) {\n this.props = extend({}, entry)\n }\n\n if (this._splitStorage) {\n this._loadGroupEntries()\n }\n }\n\n // Merge each group entry over `props`, which already holds the main blob.\n // On a first upgrade the main blob may still carry the old flag\n // values; a present group entry wins, so we resolve\n // `props[key] = group[key] ?? main[key]` in a single pass (the \"check the\n // old key once\" migration). The first `save()` then strips the keys from\n // the main blob. Group entries are localStorage-only (read via `localStore`\n // directly, never the cookie or the localPlusCookie re-write-on-parse path).\n private _loadGroupEntries(): void {\n for (const group of PERSISTENCE_STORAGE_GROUPS) {\n // `localStore._parse` returns `{}` (not null) for a missing key, so\n // gate on real content: an empty/absent entry is not \"persisted\" and\n // must not be tracked, or `_writeNowSplit` would re-create it as `{}`.\n const groupEntry = localStore._parse(this._groupEntryName(group))\n if (groupEntry && !isEmptyObject(groupEntry)) {\n const state = this._slotWriteState(group)\n state.persisted = true\n // Seed the no-op fingerprint with the snapshot we just read, so the\n // first frequent main-blob save at startup (before fresh flags\n // return from the network) recognises an unchanged flag entry and\n // neither re-serializes nor re-broadcasts it to every open tab.\n // Only safe when the main blob carries no key for this group: a\n // leftover (partial migration, or a stale tab that wrote a flag key\n // back to main) makes the partitioned payload differ from what is on\n // disk, so the entry must still be written. Leaving it unseeded then\n // lets the first save's fingerprint check write the merged payload\n // through — completing the migration / healing the orphan. The\n // `_writeEntry` group fast-path skips on `!dirty && fingerprint set`,\n // which would otherwise short-circuit that write before the\n // fingerprint is even compared.\n if (!this._mainCarriesGroupKey(group)) {\n state.fingerprint = this._entryFingerprint(groupEntry, group)\n }\n // The group entry is normally the migrated-forward home and wins\n // over the main blob. The exception: a group that stamps a\n // freshness timestamp (flags: $feature_flag_evaluated_at) lets us\n // detect when a gate-off / older-SDK tab wrote a fresher payload\n // back into the main blob — then we keep the main blob and let the\n // next save heal the group entry. With no timestamp on either side\n // (migration leftover) the group wins.\n if (!this._groupEntryIsStale(group, groupEntry)) {\n extend(this.props, groupEntry)\n }\n }\n }\n }\n\n // True when the already-loaded main blob still holds a key belonging to this\n // group — a migration leftover the next save must fold into the group entry.\n // Checked before the group entry is merged in, so it sees only the main blob's\n // own keys (sibling groups carry a different storageGroup and never match).\n private _mainCarriesGroupKey(group: PersistenceStorageGroup): boolean {\n return Object.keys(this.props).some((key) => getPersistenceKeyPolicy(key)?.storageGroup === group)\n }\n\n private _groupEntryIsStale(group: PersistenceStorageGroup, groupEntry: Properties): boolean {\n const freshnessKey = GROUP_FRESHNESS_KEY[group]\n if (!freshnessKey) {\n return false\n }\n const groupLoadedAt = groupEntry[freshnessKey]\n const mainLoadedAt = this.props[freshnessKey]\n return isNumber(groupLoadedAt) && isNumber(mainLoadedAt) && mainLoadedAt > groupLoadedAt\n }\n\n /**\n * Refresh a single key from on-disk storage into `this.props` without\n * touching the rest. Used by `SessionIdManager` on the cross-tab idle\n * path so we can pick up a sibling tab's SESSION_ID write without\n * either:\n * - flushing our own (potentially stale) whole-props blob to storage\n * via `flush()`, which would clobber the sibling's write, or\n * - replacing all of `props` via `load()`, which would discard any\n * in-memory writes that haven't yet been debounced to storage.\n */\n refreshKey(prop: string): void {\n if (this._disabled) {\n return\n }\n const group = this._splitStorage ? getPersistenceKeyPolicy(prop)?.storageGroup : undefined\n const entry = group ? localStore._parse(this._groupEntryName(group)) : this._storage._parse(this._name)\n if (entry && prop in entry) {\n this._setProp(prop, entry[prop])\n return\n }\n // A grouped key that has not migrated yet still lives in the main blob;\n // check there once before concluding a sibling removed it.\n if (group) {\n const mainEntry = this._storage._parse(this._name)\n if (mainEntry && prop in mainEntry) {\n this._setProp(prop, mainEntry[prop])\n return\n }\n }\n this._deleteProp(prop)\n }\n\n /**\n * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n * observe cookie changes, and modify their UI, often causing infinite loops.\n * As such callers of this should ideally check that the data has changed beforehand\n */\n save(): void {\n if (this._disabled) {\n return\n }\n\n const debounce = this._saveDebounceMs()\n if (debounce <= 0) {\n this._writeNow()\n return\n }\n // Coalesce: if a flush is already scheduled, the latest `props`\n // will be picked up when the timer fires. Otherwise schedule one.\n if (!isUndefined(this._pendingSaveTimer)) {\n return\n }\n this._pendingSaveTimer = setTimeout(() => {\n this._pendingSaveTimer = undefined\n this._writeNow()\n }, debounce)\n }\n\n /**\n * Force any pending debounced save to land in storage immediately.\n * No-op when there is no pending timer — crucially, this means the\n * `beforeunload` / `pagehide` listeners installed in the constructor\n * cannot accidentally resurrect a storage entry that `remove()` or\n * `clear()` just deleted. Without this guard, the listener would\n * call `_writeNow()` and write the in-memory `props` (now `{}`) back\n * to storage, breaking `posthog.reset()` / opt-out flows.\n */\n flush(): void {\n if (isUndefined(this._pendingSaveTimer)) {\n return\n }\n clearTimeout(this._pendingSaveTimer)\n this._pendingSaveTimer = undefined\n this._writeNow()\n }\n\n private _writeNow(): void {\n if (this._disabled) {\n return\n }\n\n if (this._splitStorage) {\n this._writeNowSplit()\n return\n }\n\n this._writeEntry(this._storage, this._name, this.props, MAIN_STORAGE_SLOT)\n }\n\n // Partition `props` by storage group and write each entry independently:\n // the main blob without the grouped keys (stripping them completes the\n // migration), plus one entry per group holding only its keys. Per-entry\n // fingerprints mean a main-blob change does not rewrite the rarely-changing\n // flag entries, and vice-versa — which is the whole bandwidth win.\n // Group entries go to `localStore` directly so they never hit the 4 KB\n // cookie or the localPlusCookie re-write-on-parse path. INVARIANT: keep group\n // entries on `localStore` — `_entryFingerprint` omits the cookie options from\n // group fingerprints precisely because cookies can never carry a group entry;\n // routing one to a cookie store would make a cookie-option change silently\n // skip a needed rewrite.\n private _writeNowSplit(): void {\n const { main, groups } = this._partitionProps()\n this._writeEntry(this._storage, this._name, main, MAIN_STORAGE_SLOT)\n for (const group of PERSISTENCE_STORAGE_GROUPS) {\n const groupProps = groups[group]\n // Don't materialize an entry just to hold `{}`: skip a group that is\n // empty and has never been persisted. Once a group has held content\n // we keep writing it (even when empty) so a later clear actually lands.\n if (isEmptyObject(groupProps) && !this._slotState[group]?.persisted) {\n continue\n }\n // `_writeEntry` marks the slot `persisted` (on `_slotState`) only\n // after a confirmed-successful `_set`, so a failed (e.g. quota) write\n // does not falsely mark the group as materialized on disk.\n this._writeEntry(localStore, this._groupEntryName(group), groupProps, group)\n }\n }\n\n private _partitionProps(): { main: Properties; groups: Record<PersistenceStorageGroup, Properties> } {\n const main: Properties = {}\n const groups: Record<PersistenceStorageGroup, Properties> = { flags: {}, surveys: {} }\n each(this.props, (value, key) => {\n const group = getPersistenceKeyPolicy(key)?.storageGroup\n if (group) {\n groups[group][key] = value\n } else {\n main[key] = value\n }\n })\n return { main, groups }\n }\n\n // The no-op-rejection snapshot for an entry. The main entry can live in a\n // cookie, so its fingerprint also covers the cookie options (expire_days,\n // cross_subdomain, secure): a `set_config({ cookie_expiration })` must force\n // a rewrite even when props are unchanged, otherwise the cookie keeps its old\n // `Expires` header until some other prop changes. Group entries are\n // localStorage-only — cookie options never reach them, so excluding those\n // keeps a group fingerprint a pure function of its payload. That lets `load()`\n // seed it before the cookie options are even resolved, and keeps it stable\n // across the cookie-option setters that run during construction, so an\n // unchanged flag entry is neither re-serialized nor re-broadcast.\n private _entryFingerprint(props: Properties, slot: StorageSlot): string {\n if (slot === MAIN_STORAGE_SLOT) {\n return JSON.stringify(props) + '|' + this._expire_days + '|' + this._cross_subdomain + '|' + this._secure\n }\n // Volatile keys count by presence only: a write triggered by a real\n // content change records a fingerprint that stays valid while the\n // volatile values keep moving between writes, but adding or deleting a\n // volatile key still changes the fingerprint so the entry writes through.\n const stable: Properties = {}\n each(props, (value, key) => {\n stable[key] = getPersistenceKeyPolicy(key)?.volatile ? VOLATILE_FINGERPRINT_PLACEHOLDER : value\n })\n return JSON.stringify(stable)\n }\n\n // No-op rejection: skip the write when nothing that affects this entry has\n // changed since the last successful write. Callers spam `save()` after every\n // property change, and many of those changes leave the storage payload\n // unchanged. Writing identical bytes to localStorage still fires a cross-tab\n // `storage` event where Chrome allocates the payload buffer in mojo IPC even\n // though no listener reacts.\n //\n // JSON.stringify can throw on BigInt / circular refs. We let the\n // underlying storage layer keep its existing try/catch behaviour\n // (log and drop) by falling through on serialization errors.\n private _writeEntry(storage: PersistentStore, name: string, props: Properties, slot: StorageSlot): void {\n const state = this._slotWriteState(slot)\n // Fast path for group slots (localStorage-only): when nothing in the\n // group changed since its last successful write, skip the JSON.stringify\n // of the large flag payload entirely. The main slot is excluded —\n // it is small, changes on nearly every write, and carries cookie options\n // in its fingerprint, so it always serializes.\n if (slot !== MAIN_STORAGE_SLOT && !state.dirty && !isUndefined(state.fingerprint)) {\n return\n }\n\n let fingerprint: string | undefined\n try {\n fingerprint = this._entryFingerprint(props, slot)\n if (fingerprint === state.fingerprint) {\n state.dirty = false\n return\n }\n } catch {\n // serialization failed (BigInt / circular ref); fall through to\n // storage._set, which handles the error itself, but don't cache an\n // un-fingerprinted write.\n fingerprint = undefined\n }\n\n // Record the fingerprint (and clear the dirty flag, mark persisted) only\n // after a confirmed-successful durable write: localStorage / sessionStorage\n // swallow quota errors, so caching ahead of a failed write would skip\n // every future retry and silently lose the entry.\n if (storage._set(name, props, this._expire_days, this._cross_subdomain, this._secure, this._config.debug)) {\n state.dirty = false\n if (slot !== MAIN_STORAGE_SLOT) {\n // The group entry has now actually landed on disk — only here is\n // it correct to record it as persisted (gates the empty-entry\n // skip in `_writeNowSplit`).\n state.persisted = true\n }\n if (!isUndefined(fingerprint)) {\n state.fingerprint = fingerprint\n }\n } else if (this._config.debug) {\n // The durable write did not land (e.g. localStorage quota). The slot\n // stays dirty / un-fingerprinted so the next save retries it; surface\n // it under debug so a repeated failure on a group entry — which would\n // otherwise silently strand the flag cache — is visible.\n logger.warn(`failed to persist storage entry \"${name}\"; will retry on next save`)\n }\n }\n\n // `keepGroupEntries` is set by the cookie-option setters (set_secure /\n // set_cross_subdomain). A cookie-scope change has to clear the cookie-backed\n // main entry, but the group entries are localStorage-only and entirely\n // scope-independent, so deleting and rewriting them would be the exact\n // per-page-load flag-blob churn the split exists to remove (these setters fire\n // once each on every construction, transitioning the in-memory option from\n // undefined to its configured value). Opt-out / reset (set_disabled / clear)\n // pass nothing and wipe everything.\n //\n // INVARIANT for `keepGroupEntries: true`: the caller must not also mutate\n // `props`. We keep the on-disk group entries AND their retained fingerprint;\n // that is only safe while `props` still matches what is on disk. The cookie\n // setters satisfy this (they touch only `_secure` / `_cross_subdomain`). A\n // future caller that clears or rewrites `props` while keeping the entries\n // would leave the retained fingerprint describing stale on-disk content and\n // skip the corrective write.\n remove({ keepGroupEntries = false }: { keepGroupEntries?: boolean } = {}): void {\n // Cancel any pending debounced write — the storage entry is going\n // away so there is nothing useful to flush.\n if (!isUndefined(this._pendingSaveTimer)) {\n clearTimeout(this._pendingSaveTimer)\n this._pendingSaveTimer = undefined\n }\n // remove both domain and subdomain cookies\n this._storage._remove(this._name, false)\n this._storage._remove(this._name, true)\n // Wipe the group entries too — even when the split is currently off — so\n // a default flip-flop or version downgrade cannot strand an orphaned\n // flag entry that would leak across users on reset()/opt-out.\n // Only the owning instance does this: the sessionStorage sibling\n // posthog-core spins up shares this instance's storage name, so it must\n // not delete the localStorage owner's entries. localStorage-only.\n if (!keepGroupEntries && this._ownsSplitStorage) {\n for (const group of PERSISTENCE_STORAGE_GROUPS) {\n localStore._remove(this._groupEntryName(group))\n }\n }\n // The main entry is gone, so its bookkeeping must reset for the next\n // save to write through. When the group entries are kept, so is their\n // fingerprint/persisted state — that is what lets the following save\n // recognise them as unchanged and skip the rewrite.\n if (keepGroupEntries) {\n delete this._slotState[MAIN_STORAGE_SLOT]\n } else {\n this._slotState = {}\n }\n }\n\n // removes the storage entry and deletes all loaded data\n // forced name for tests\n\n clear(): void {\n this.remove()\n this.props = {}\n }\n\n /**\n * @param {Object} props\n * @param {*=} default_value\n * @param {number=} days\n */\n\n register_once(props: Properties, default_value: any, days?: number): boolean {\n if (isObject(props)) {\n if (isUndefined(default_value)) {\n default_value = 'None'\n }\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n this._setProp(prop, val)\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n /**\n * @param {Object} props\n * @param {number=} days\n */\n\n register(props: Properties, days?: number): boolean {\n if (isObject(props)) {\n this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n let hasChanges = false\n\n each(props, (val, prop) => {\n if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n this._setProp(prop, val)\n hasChanges = true\n }\n })\n\n if (hasChanges) {\n this.save()\n return true\n }\n }\n return false\n }\n\n unregister(prop: string): void {\n if (prop in this.props) {\n this._deleteProp(prop)\n this.save()\n }\n }\n\n update_campaign_params(): void {\n if (!this._campaign_params_saved) {\n const campaignParams = getCampaignParams(\n this._config.custom_campaign_params,\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties\n )\n // only save campaign params if there were any\n if (!isEmptyObject(stripEmptyProperties(campaignParams))) {\n this.register(campaignParams)\n }\n this._campaign_params_saved = true\n }\n }\n update_search_keyword(): void {\n this.register(getSearchInfo())\n }\n\n update_referrer_info(): void {\n this.register_once(getReferrerInfo(), undefined)\n }\n\n set_initial_person_info(): void {\n if (this.props[INITIAL_CAMPAIGN_PARAMS] || this.props[INITIAL_REFERRER_INFO]) {\n // the user has initial properties stored the previous way, don't save them again\n return\n }\n\n this.register_once(\n {\n [INITIAL_PERSON_INFO]: getPersonInfo(\n this._config.mask_personal_data_properties,\n this._config.custom_personal_data_properties,\n this._config.disable_capture_url_hashes\n ),\n },\n undefined\n )\n }\n\n get_initial_props(): Properties {\n const p: Properties = {}\n\n // this section isn't written to anymore, but we should keep reading from it for backwards compatibility\n // for a while\n each([INITIAL_REFERRER_INFO, INITIAL_CAMPAIGN_PARAMS], (key) => {\n const initialReferrerInfo = this.props[key]\n if (initialReferrerInfo) {\n each(initialReferrerInfo, function (v, k) {\n p['$initial_' + stripLeadingDollar(k)] = v\n })\n }\n })\n const initialPersonInfo = this.props[INITIAL_PERSON_INFO]\n if (initialPersonInfo) {\n const initialPersonProps = getInitialPersonPropsFromInfo(\n initialPersonInfo,\n this._config.disable_capture_url_hashes\n )\n extend(p, initialPersonProps)\n }\n\n return p\n }\n\n // safely fills the passed in object with stored properties,\n // does not override any properties defined in both\n // returns the passed in object\n\n safe_merge(props: Properties): Properties {\n each(this.props, function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val\n }\n })\n\n return props\n }\n\n update_config(config: PostHogConfig, oldConfig: PostHogConfig, isDisabled?: boolean): void {\n this._default_expiry = this._expire_days = config['cookie_expiration']\n this.set_disabled(config['disable_persistence'] || !!isDisabled)\n this.set_cross_subdomain(config['cross_subdomain_cookie'])\n this.set_secure(config['secure_cookie'])\n\n const persistenceChanged =\n config.persistence !== oldConfig.persistence ||\n !isArrayContentsEqual(config.cookie_persisted_properties || [], oldConfig.cookie_persisted_properties || [])\n\n // `_buildStorage` re-resolves both the backend and `_splitStorageEligible`,\n // so on a persistence change build the new store first, then derive the\n // split flag from the fresh eligibility. The new backend may no longer be\n // split-eligible (e.g. localStorage -> memory).\n const newStore = persistenceChanged ? this._buildStorage(config) : this._storage\n const wantSplit = this._resolveSplitStorage(config)\n\n // Migrate when the backend changed or the split routing flipped at\n // runtime, e.g. set_config({ split_storage: true })\n // without touching persistence. Either way we clear the old layout and\n // re-save so subsequent reads/writes land in the right entries.\n if (persistenceChanged || wantSplit !== this._splitStorage) {\n const props = this.props\n this.clear()\n this._storage = newStore\n this._splitStorage = wantSplit\n this.props = props\n this.save()\n }\n }\n\n set_disabled(disabled: boolean): void {\n this._disabled = disabled\n if (this._disabled) {\n this.remove()\n } else {\n this.save()\n }\n }\n\n set_cross_subdomain(cross_subdomain: boolean): void {\n if (cross_subdomain !== this._cross_subdomain) {\n this._cross_subdomain = cross_subdomain\n this.remove({ keepGroupEntries: true })\n this.save()\n }\n }\n\n set_secure(secure: boolean): void {\n if (secure !== this._secure) {\n this._secure = secure\n this.remove({ keepGroupEntries: true })\n this.save()\n }\n }\n\n set_event_timer(event_name: string, timestamp: number): void {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n timers[event_name] = timestamp\n this._setProp(EVENT_TIMERS_KEY, timers)\n this.save()\n }\n\n remove_event_timer(event_name: string): number {\n const timers = this.props[EVENT_TIMERS_KEY] || {}\n const timestamp = timers[event_name]\n if (!isUndefined(timestamp)) {\n delete timers[event_name]\n this._setProp(EVENT_TIMERS_KEY, timers)\n this.save()\n }\n return timestamp\n }\n\n get_property(prop: string): any {\n return this.props[prop]\n }\n\n set_property(prop: string, to: any): void {\n this._setProp(prop, to)\n this.save()\n }\n\n private _setProp(prop: string, to: any): void {\n this.props[prop] = to\n // A volatile value change never dirties its group — it changes on every\n // remote load and would otherwise force a rewrite of the large entry per\n // load. Deletions still dirty (see _deleteProp): presence is part of the\n // fingerprint, the moving value is not.\n if (!getPersistenceKeyPolicy(prop)?.volatile) {\n this._markGroupDirty(prop)\n }\n }\n\n private _deleteProp(prop: string): void {\n delete this.props[prop]\n this._markGroupDirty(prop)\n }\n\n // Mark the prop's storage group dirty so its entry is re-serialized on the\n // next write. Props with no group live in the main blob, which always writes.\n private _markGroupDirty(prop: string): void {\n const group = getPersistenceKeyPolicy(prop)?.storageGroup\n if (group) {\n this._slotWriteState(group).dirty = true\n }\n }\n\n // The write-bookkeeping record for a slot, created on first access.\n private _slotWriteState(slot: StorageSlot): SlotWriteState {\n return this._slotState[slot] || (this._slotState[slot] = {})\n }\n}\n","/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\n\nimport type { Properties, PropertyMatchType } from './types'\nimport type {\n SurveyAppearance as CoreSurveyAppearance,\n SurveyQuestionTranslation,\n SurveyResponseValue as CoreSurveyResponseValue,\n SurveyTranslation,\n SurveyValidationRule,\n} from '@posthog/core'\n\n// Extended operator type to include numeric operators not in PropertyMatchType\nexport type PropertyOperator = PropertyMatchType | 'gt' | 'lt'\n\nexport type PropertyFilters = {\n [propertyName: string]: {\n values: string[]\n operator: PropertyOperator\n }\n}\n\nexport interface SurveyEventWithFilters {\n name: string\n propertyFilters?: PropertyFilters\n}\n\n// Extends core SurveyAppearance with browser-specific fields\n// Omit 'position' from core because browser's SurveyPosition has additional values (e.g., NextToTrigger)\nexport interface SurveyAppearance extends Omit<CoreSurveyAppearance, 'position' | 'widgetType'> {\n // Browser-specific fields not in core\n /** @deprecated - not currently used */\n descriptionTextColor?: string\n ratingButtonHoverColor?: string\n whiteLabel?: boolean\n tabPosition?: SurveyTabPosition\n fontFamily?: string\n maxWidth?: string\n zIndex?: string\n disabledButtonOpacity?: string\n boxPadding?: string\n /** @deprecated Use inputBackground instead (inherited from core) */\n inputBackgroundColor?: string\n // Hide the X (cancel) button - defaults to false (show the button)\n hideCancelButton?: boolean\n // Don't automatically focus the first open-text input when the question renders.\n // Defaults to false (the input is focused), preserving existing behavior.\n disableAutofocus?: boolean\n // Browser's SurveyPosition has more options than core (e.g., NextToTrigger)\n position?: SurveyPosition\n widgetType?: SurveyWidgetType\n}\n\nexport type SurveyQuestion = BasicSurveyQuestion | LinkSurveyQuestion | RatingSurveyQuestion | MultipleSurveyQuestion\n\nexport type SurveyQuestionDescriptionContentType = 'html' | 'text'\n\ninterface SurveyQuestionBase {\n question: string\n id?: string\n description?: string | null\n descriptionContentType?: SurveyQuestionDescriptionContentType\n optional?: boolean\n buttonText?: string\n branching?: NextQuestionBranching | EndBranching | ResponseBasedBranching | SpecificQuestionBranching\n validation?: SurveyValidationRule[]\n translations?: Record<string, SurveyQuestionTranslation>\n}\n\nexport interface BasicSurveyQuestion extends SurveyQuestionBase {\n type: typeof SurveyQuestionType.Open\n}\n\nexport interface LinkSurveyQuestion extends SurveyQuestionBase {\n type: typeof SurveyQuestionType.Link\n link?: string | null\n}\n\nexport interface RatingSurveyQuestion extends SurveyQuestionBase {\n type: typeof SurveyQuestionType.Rating\n display: 'number' | 'emoji'\n scale: 2 | 3 | 5 | 7 | 10\n lowerBoundLabel: string\n upperBoundLabel: string\n skipSubmitButton?: boolean\n}\n\nexport interface MultipleSurveyQuestion extends SurveyQuestionBase {\n type: typeof SurveyQuestionType.SingleChoice | typeof SurveyQuestionType.MultipleChoice\n choices: string[]\n hasOpenChoice?: boolean\n shuffleOptions?: boolean\n skipSubmitButton?: boolean\n}\n\ninterface NextQuestionBranching {\n type: typeof SurveyQuestionBranchingType.NextQuestion\n}\n\ninterface EndBranching {\n type: typeof SurveyQuestionBranchingType.End\n}\n\ninterface ResponseBasedBranching {\n type: typeof SurveyQuestionBranchingType.ResponseBased\n responseValues: Record<string, any>\n}\n\ninterface SpecificQuestionBranching {\n type: typeof SurveyQuestionBranchingType.SpecificQuestion\n index: number\n}\n\nexport type SurveyCallback = (surveys: Survey[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport interface SurveyElement {\n text?: string\n $el_text?: string\n tag_name?: string\n href?: string\n attr_id?: string\n attr_class?: string[]\n nth_child?: number\n nth_of_type?: number\n attributes?: Record<string, any>\n event_id?: number\n order?: number\n group_id?: number\n}\n\n// Re-export from @posthog/types to avoid duplication\nexport type { SurveyRenderReason } from '@posthog/types'\n\nexport interface Survey {\n // Sync this with the backend's SurveyAPISerializer!\n id: string\n name: string\n description?: string\n type: SurveyType\n translations?: Record<string, SurveyTranslation>\n feature_flag_keys:\n | {\n key: string\n value?: string\n }[]\n | null\n // the linked flag key is the flag key that is used to link the survey to a flag\n linked_flag_key: string | null\n targeting_flag_key: string | null\n // the internal targeting flag key is the flag key that is used to target users who have seen the survey\n // eg survey-targeting-<survey-id>\n internal_targeting_flag_key: string | null\n questions: SurveyQuestion[]\n appearance: SurveyAppearance | null\n conditions: {\n url?: string\n selector?: string\n seenSurveyWaitPeriodInDays?: number\n urlMatchType?: PropertyMatchType\n /** events that trigger surveys */\n events: {\n repeatedActivation?: boolean\n values: SurveyEventWithFilters[]\n } | null\n /** events that cancel \"pending\" (time-delayed) surveys */\n cancelEvents: {\n values: SurveyEventWithFilters[]\n } | null\n actions: {\n values: SurveyActionType[]\n } | null\n deviceTypes?: string[]\n deviceTypesMatchType?: PropertyMatchType\n linkedFlagVariant?: string\n } | null\n start_date: string | null\n end_date: string | null\n current_iteration: number | null\n current_iteration_start_date: string | null\n schedule?: SurveySchedule | null\n enable_partial_responses?: boolean | null\n}\n\nexport type SurveyWithTypeAndAppearance = Pick<Survey, 'id' | 'type' | 'appearance'>\n\nexport interface SurveyActionType {\n id: number\n name: string | null\n steps?: ActionStepType[]\n}\n\n/** Sync with plugin-server/src/types.ts */\nexport type ActionStepStringMatching = 'contains' | 'exact' | 'regex'\n\nexport interface ActionStepType {\n event?: string | null\n selector?: string | null\n /** pre-compiled regex pattern for matching selector against $elements_chain */\n selector_regex?: string | null\n /** @deprecated Only `selector` should be used now. */\n tag_name?: string\n text?: string | null\n /** @default StringMatching.Exact */\n text_matching?: ActionStepStringMatching | null\n href?: string | null\n /** @default ActionStepStringMatching.Exact */\n href_matching?: ActionStepStringMatching | null\n url?: string | null\n /** @default StringMatching.Contains */\n url_matching?: ActionStepStringMatching | null\n /** Property filters for action step matching */\n properties?: {\n key: string\n value?: string | number | boolean | (string | number | boolean)[] | null\n operator?: PropertyMatchType\n type?: string\n }[]\n}\n\ninterface DisplaySurveyOptionsBase {\n /**\n * Whether to bypass the survey's targeting and display conditions.\n * @default false\n */\n ignoreConditions: boolean\n\n /**\n * Whether to bypass the survey's configured popup delay.\n * @default false\n */\n ignoreDelay: boolean\n\n /**\n * How the survey should be displayed.\n * @default DisplaySurveyType.Popover\n */\n displayType: DisplaySurveyType\n\n /** Additional properties to include in all survey events (shown, sent, dismissed). */\n properties?: Properties\n\n /** Pre-filled responses by question index (0-based). Only supported for popover surveys. */\n initialResponses?: Record<number, SurveyResponseValue>\n}\n\n/** Options for displaying a survey as a popover. */\nexport interface DisplaySurveyPopoverOptions extends DisplaySurveyOptionsBase {\n displayType: typeof DisplaySurveyType.Popover\n /** Override the survey's configured position. */\n position?: SurveyPosition\n /** CSS selector for the element to position the survey next to (when position is NextToTrigger). */\n selector?: string\n /** When true, `survey shown` events will not be emitted automatically. */\n skipShownEvent?: boolean\n}\n\ninterface DisplaySurveyInlineOptions extends DisplaySurveyOptionsBase {\n displayType: typeof DisplaySurveyType.Inline\n /** CSS selector for the element where the inline survey should render. */\n selector: string\n}\n\n/** Options for `posthog.displaySurvey()`. */\nexport type DisplaySurveyOptions = DisplaySurveyPopoverOptions | DisplaySurveyInlineOptions\n\nexport interface SurveyConfig {\n /**\n * Prefill survey responses from matching URL parameters.\n *\n * @default undefined\n */\n prefillFromUrl?: boolean\n /**\n * @deprecated No longer used. Surveys will automatically advance past\n * prefilled questions with skipSubmitButton enabled. If partial response\n * collection is enabled, partial responses for pre-filled questions will\n * be submitted automatically on page load.\n */\n autoSubmitIfComplete?: boolean\n /**\n * @deprecated No longer used. Pre-filled responses are now sent\n * immediately when partial responses are enabled, or all required\n * questions have been pre-filled.\n */\n autoSubmitDelay?: number\n}\n\nexport type SurveyResponseValue = CoreSurveyResponseValue\n\n/**\n * Surveys related enums and constants.\n * We use const objects instead of TypeScript enums to allow for easier tree-shaking and to avoid issues with enum imports in JavaScript.\n */\n\nexport const SurveyEventType = {\n Activation: 'events',\n Cancellation: 'cancelEvents',\n} as const\nexport type SurveyEventType = (typeof SurveyEventType)[keyof typeof SurveyEventType]\n\nexport const SurveyWidgetType = {\n Button: 'button',\n Tab: 'tab',\n Selector: 'selector',\n} as const\nexport type SurveyWidgetType = (typeof SurveyWidgetType)[keyof typeof SurveyWidgetType]\n\nexport const SurveyPosition = {\n TopLeft: 'top_left',\n TopRight: 'top_right',\n TopCenter: 'top_center',\n MiddleLeft: 'middle_left',\n MiddleRight: 'middle_right',\n MiddleCenter: 'middle_center',\n Left: 'left',\n Center: 'center',\n Right: 'right',\n NextToTrigger: 'next_to_trigger',\n} as const\nexport type SurveyPosition = (typeof SurveyPosition)[keyof typeof SurveyPosition]\n\nexport const SurveyTabPosition = {\n Top: 'top',\n Left: 'left',\n Right: 'right',\n Bottom: 'bottom',\n} as const\nexport type SurveyTabPosition = (typeof SurveyTabPosition)[keyof typeof SurveyTabPosition]\n\nexport const SurveyType = {\n Popover: 'popover',\n API: 'api',\n Widget: 'widget',\n ExternalSurvey: 'external_survey',\n} as const\nexport type SurveyType = (typeof SurveyType)[keyof typeof SurveyType]\n\nexport const SurveyQuestionType = {\n Open: 'open',\n MultipleChoice: 'multiple_choice',\n SingleChoice: 'single_choice',\n Rating: 'rating',\n Link: 'link',\n} as const\nexport type SurveyQuestionType = (typeof SurveyQuestionType)[keyof typeof SurveyQuestionType]\n\nexport const SurveyQuestionBranchingType = {\n NextQuestion: 'next_question',\n End: 'end',\n ResponseBased: 'response_based',\n SpecificQuestion: 'specific_question',\n} as const\nexport type SurveyQuestionBranchingType = (typeof SurveyQuestionBranchingType)[keyof typeof SurveyQuestionBranchingType]\n\nexport const SurveySchedule = {\n Once: 'once',\n Recurring: 'recurring',\n Always: 'always',\n} as const\nexport type SurveySchedule = (typeof SurveySchedule)[keyof typeof SurveySchedule]\n\nexport const SurveyEventName = {\n SHOWN: 'survey shown',\n DISMISSED: 'survey dismissed',\n SENT: 'survey sent',\n ABANDONED: 'survey abandoned',\n} as const\nexport type SurveyEventName = (typeof SurveyEventName)[keyof typeof SurveyEventName]\n\nexport const SurveyEventProperties = {\n SURVEY_ID: '$survey_id',\n SURVEY_NAME: '$survey_name',\n SURVEY_RESPONSE: '$survey_response',\n SURVEY_ITERATION: '$survey_iteration',\n SURVEY_ITERATION_START_DATE: '$survey_iteration_start_date',\n SURVEY_PARTIALLY_COMPLETED: '$survey_partially_completed',\n SURVEY_SUBMISSION_ID: '$survey_submission_id',\n SURVEY_QUESTIONS: '$survey_questions',\n SURVEY_COMPLETED: '$survey_completed',\n PRODUCT_TOUR_ID: '$product_tour_id',\n SURVEY_LAST_SEEN_DATE: '$survey_last_seen_date',\n SURVEY_LANGUAGE: '$survey_language',\n} as const\nexport type SurveyEventProperties = (typeof SurveyEventProperties)[keyof typeof SurveyEventProperties]\n\nexport const DisplaySurveyType = {\n Popover: 'popover',\n Inline: 'inline',\n} as const\nexport type DisplaySurveyType = (typeof DisplaySurveyType)[keyof typeof DisplaySurveyType]\n","import { PropertyMatchType } from './types'\nimport { SurveyActionType, SurveyEventWithFilters } from './posthog-surveys-types'\nimport type { InferredSelector } from './extensions/product-tours/element-inference'\nimport { SurveyPosition } from '@posthog/core'\nimport { Z_INDEX_TOURS } from './constants'\n\nexport interface JSONContent {\n type?: string\n attrs?: Record<string, any>\n content?: JSONContent[]\n marks?: { type: string; attrs?: Record<string, any> }[]\n text?: string\n}\n\nexport type ProductTourStepType = 'element' | 'modal' | 'survey' | 'banner'\n\nexport interface ProductTourBannerConfig {\n behavior: 'sticky' | 'static' | 'custom'\n selector?: string\n action?: {\n type: 'none' | 'link' | 'trigger_tour'\n link?: string\n tourId?: string\n }\n animation?: {\n duration?: number\n }\n}\n\n/** Button actions available on modal steps */\nexport type ProductTourButtonAction = 'dismiss' | 'link' | 'next_step' | 'previous_step' | 'trigger_tour'\n\nexport interface ProductTourStepButton {\n text: string\n action: ProductTourButtonAction\n /** URL to open when action is 'link' */\n link?: string\n /** Tour ID to trigger when action is 'trigger_tour' */\n tourId?: string\n}\n\nexport interface ProductTourStepButtons {\n primary?: ProductTourStepButton\n secondary?: ProductTourStepButton\n}\n\nexport type ProductTourSurveyQuestionType = 'open' | 'rating'\n\nexport interface ProductTourSurveyQuestion {\n type: ProductTourSurveyQuestionType\n questionText: string\n /** Rating display type - emoji or number */\n display?: 'emoji' | 'number'\n /** Rating scale - 3 or 5 for emoji, 5 or 10 for number */\n scale?: 3 | 5 | 10\n /** Label for low end of rating scale (e.g., \"Not likely\") */\n lowerBoundLabel?: string\n /** Label for high end of rating scale (e.g., \"Very likely\") */\n upperBoundLabel?: string\n submitButtonText?: string\n backButtonText?: string\n}\n\nexport interface ProductTourStep {\n id: string\n type: ProductTourStepType\n selector?: string\n progressionTrigger: 'button' | 'click'\n content: JSONContent | null\n /** Pre-rendered HTML content from the editor. If present, SDK should use this instead of rendering from JSONContent. */\n contentHtml?: string\n /** Inline survey question config - if present, this is a survey step */\n survey?: ProductTourSurveyQuestion\n /** ID of the auto-created survey for this step (set by backend) */\n linkedSurveyId?: string\n /** ID of the survey question (set by backend, used for event tracking) */\n linkedSurveyQuestionId?: string\n /** Enhanced element data for more reliable lookup at runtime */\n inferenceData?: InferredSelector\n /** Use CSS selector instead of inference. Defaults to false (use inference). */\n useManualSelector?: boolean\n /** Maximum tooltip width in pixels (defaults to 320px) */\n maxWidth?: number\n /** Position for modal/survey steps (defaults to middle_center) */\n modalPosition?: SurveyPosition\n /** Button configuration for modal steps */\n buttons?: ProductTourStepButtons\n /** Banner configuration (only for banner steps) */\n bannerConfig?: ProductTourBannerConfig\n /** translation data for this tour step */\n translations?: Record<string, ProductTourStepTranslation>\n}\n\n/** all translatable content for a given tour step */\nexport interface ProductTourStepTranslation {\n content?: ProductTourStep['content']\n contentHtml?: ProductTourStep['contentHtml']\n buttons?: {\n primary?: Pick<ProductTourStepButton, 'text'>\n secondary?: Pick<ProductTourStepButton, 'text'>\n }\n survey?: Pick<\n ProductTourSurveyQuestion,\n 'questionText' | 'lowerBoundLabel' | 'upperBoundLabel' | 'submitButtonText' | 'backButtonText'\n >\n}\n\n/** maps to main repo EffectiveProductTourType */\nexport type ProductTourType = 'tour' | 'announcement' | 'banner'\n\nexport interface ProductTourWaitPeriod {\n days: number\n types: ProductTourType[]\n}\n\nexport interface ProductTourConditions {\n url?: string\n urlMatchType?: PropertyMatchType\n selector?: string\n autoShowDelaySeconds?: number\n events?: {\n values: SurveyEventWithFilters[]\n } | null\n cancelEvents?: {\n values: SurveyEventWithFilters[]\n } | null\n actions?: {\n values: SurveyActionType[]\n } | null\n linkedFlagVariant?: string\n deviceTypes?: string[]\n seenTourWaitPeriod?: ProductTourWaitPeriod\n}\n\nexport interface ProductTourAppearance {\n backgroundColor?: string\n textColor?: string\n buttonColor?: string\n borderRadius?: number\n buttonBorderRadius?: number\n borderColor?: string\n fontFamily?: string\n boxShadow?: string\n showOverlay?: boolean\n whiteLabel?: boolean\n /** defaults to true, auto-set to false for announcements/banners */\n dismissOnClickOutside?: boolean\n zIndex?: number\n}\n\nexport type ProductTourDisplayFrequency = 'show_once' | 'until_interacted' | 'always'\n\nexport interface ProductTour {\n id: string\n name: string\n description?: string\n tour_type: ProductTourType // inferred in API based on tour content\n auto_launch?: boolean\n start_date: string | null\n end_date: string | null\n current_iteration?: number\n conditions?: ProductTourConditions\n appearance?: ProductTourAppearance\n steps: ProductTourStep[]\n internal_targeting_flag_key?: string\n linked_flag_key?: string\n display_frequency?: ProductTourDisplayFrequency\n disable_image_preload?: boolean\n}\n\nexport type ProductTourCallback = (tours: ProductTour[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport type ProductTourSelectorError = 'not_found' | 'multiple_matches' | 'not_visible'\n\nexport type ProductTourDismissReason =\n | 'user_clicked_skip'\n | 'user_clicked_outside'\n | 'escape_key'\n | 'element_unavailable'\n | 'container_unavailable'\n\nexport type ProductTourRenderReason = 'auto' | 'api' | 'trigger' | 'event'\n\nexport const DEFAULT_PRODUCT_TOUR_APPEARANCE: Required<ProductTourAppearance> = {\n backgroundColor: '#ffffff',\n textColor: '#1d1f27',\n buttonColor: '#1d1f27',\n borderRadius: 8,\n buttonBorderRadius: 6,\n borderColor: '#e5e7eb',\n fontFamily: 'system-ui',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n showOverlay: true,\n whiteLabel: false,\n dismissOnClickOutside: true,\n zIndex: Z_INDEX_TOURS,\n}\n\nexport interface ShowTourOptions {\n reason?: ProductTourRenderReason\n enableStrictValidation?: boolean\n}\n\nexport const ProductTourEventName = {\n SHOWN: 'product tour shown',\n DISMISSED: 'product tour dismissed',\n COMPLETED: 'product tour completed',\n STEP_SHOWN: 'product tour step shown',\n STEP_COMPLETED: 'product tour step completed',\n BUTTON_CLICKED: 'product tour button clicked',\n STEP_SELECTOR_FAILED: 'product tour step selector failed',\n BANNER_CONTAINER_SELECTOR_FAILED: 'product tour banner container selector failed',\n BANNER_ACTION_CLICKED: 'product tour banner action clicked',\n} as const\nexport type ProductTourEventName = (typeof ProductTourEventName)[keyof typeof ProductTourEventName]\n\nexport const ProductTourEventProperties = {\n TOUR_ID: '$product_tour_id',\n TOUR_NAME: '$product_tour_name',\n TOUR_ITERATION: '$product_tour_iteration',\n TOUR_RENDER_REASON: '$product_tour_render_reason',\n TOUR_STEP_ID: '$product_tour_step_id',\n TOUR_STEP_ORDER: '$product_tour_step_order',\n TOUR_STEP_TYPE: '$product_tour_step_type',\n TOUR_DISMISS_REASON: '$product_tour_dismiss_reason',\n TOUR_BUTTON_TEXT: '$product_tour_button_text',\n TOUR_BUTTON_ACTION: '$product_tour_button_action',\n TOUR_BUTTON_LINK: '$product_tour_button_link',\n TOUR_BUTTON_TOUR_ID: '$product_tour_button_tour_id',\n TOUR_STEPS_COUNT: '$product_tour_steps_count',\n TOUR_STEP_SELECTOR: '$product_tour_step_selector',\n TOUR_STEP_SELECTOR_FOUND: '$product_tour_step_selector_found',\n TOUR_STEP_ELEMENT_TAG: '$product_tour_step_element_tag',\n TOUR_STEP_ELEMENT_ID: '$product_tour_step_element_id',\n TOUR_STEP_ELEMENT_CLASSES: '$product_tour_step_element_classes',\n TOUR_STEP_ELEMENT_TEXT: '$product_tour_step_element_text',\n TOUR_ERROR: '$product_tour_error',\n TOUR_MATCHES_COUNT: '$product_tour_matches_count',\n TOUR_FAILURE_PHASE: '$product_tour_failure_phase',\n TOUR_WAITED_FOR_ELEMENT: '$product_tour_waited_for_element',\n TOUR_WAIT_DURATION_MS: '$product_tour_wait_duration_ms',\n TOUR_BANNER_SELECTOR: '$product_tour_banner_selector',\n TOUR_LINKED_SURVEY_ID: '$product_tour_linked_survey_id',\n USE_MANUAL_SELECTOR: '$use_manual_selector',\n INFERENCE_DATA_PRESENT: '$inference_data_present',\n TOUR_LAST_SEEN_DATE: '$product_tour_last_seen_date',\n TOUR_TYPE: '$product_tour_type',\n} as const\nexport type ProductTourEventProperties = (typeof ProductTourEventProperties)[keyof typeof ProductTourEventProperties]\n","import { CAPTURE_RATE_LIMIT } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { RequestResponse } from './types'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nconst logger = createLogger('[RateLimiter]')\n\nconst ONE_MINUTE_IN_MILLISECONDS = 60 * 1000\nconst RATE_LIMIT_EVENT = '$$client_ingestion_warning'\nconst DEFAULT_EVENTS_PER_SECOND = 10\nconst BURST_LIMIT_MULTIPLIER = 10\n\ninterface CaptureResponse {\n quota_limited?: string[]\n}\n\nexport class RateLimiter {\n instance: PostHog\n serverLimits: Record<string, number> = {}\n lastEventRateLimited = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.lastEventRateLimited = this.clientRateLimitContext(true).isRateLimited\n }\n\n get captureEventsPerSecond(): number {\n return this.instance.config.rate_limiting?.events_per_second || DEFAULT_EVENTS_PER_SECOND\n }\n\n get captureEventsBurstLimit(): number {\n return Math.max(\n this.instance.config.rate_limiting?.events_burst_limit ||\n this.captureEventsPerSecond * BURST_LIMIT_MULTIPLIER,\n this.captureEventsPerSecond\n )\n }\n\n public clientRateLimitContext(checkOnly = false): {\n isRateLimited: boolean\n remainingTokens: number\n } {\n // This is primarily to prevent runaway loops from flooding capture with millions of events for a single user.\n // It's as much for our protection as theirs.\n const { captureEventsBurstLimit, captureEventsPerSecond } = this\n const now = new Date().getTime()\n const bucket = this.instance.persistence?.get_property(CAPTURE_RATE_LIMIT) ?? {\n tokens: captureEventsBurstLimit,\n last: now,\n }\n\n bucket.tokens += ((now - bucket.last) / 1000) * captureEventsPerSecond\n bucket.last = now\n\n if (bucket.tokens > captureEventsBurstLimit) {\n bucket.tokens = captureEventsBurstLimit\n }\n\n const isRateLimited = bucket.tokens < 1\n\n if (!isRateLimited && !checkOnly) {\n bucket.tokens = Math.max(0, bucket.tokens - 1)\n }\n\n if (isRateLimited && !this.lastEventRateLimited && !checkOnly) {\n this.instance.capture(\n RATE_LIMIT_EVENT,\n {\n $$client_ingestion_warning_message: `posthog-js client rate limited. Config is set to ${captureEventsPerSecond} events per second and ${captureEventsBurstLimit} events burst limit.`,\n },\n {\n skip_client_rate_limiting: true,\n }\n )\n }\n\n this.lastEventRateLimited = isRateLimited\n this.instance.persistence?.set_property(CAPTURE_RATE_LIMIT, bucket)\n\n return {\n isRateLimited,\n remainingTokens: bucket.tokens,\n }\n }\n\n public isServerRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.serverLimits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n public checkForLimiting = (httpResponse: RequestResponse): void => {\n const text = httpResponse.text\n\n if (!text || !text.length) {\n return\n }\n\n try {\n const response: CaptureResponse = JSON.parse(text)\n const quotaLimitedProducts = response.quota_limited || []\n quotaLimitedProducts.forEach((batchKey) => {\n logger.info(`${batchKey || 'events'} is quota limited.`)\n this.serverLimits[batchKey] = new Date().getTime() + ONE_MINUTE_IN_MILLISECONDS\n })\n } catch (e: any) {\n logger.warn(`could not rate limit - continuing. Error: \"${e?.message}\"`, { text })\n return\n }\n }\n}\n","import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\n\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\n\nconst logger = createLogger('[RemoteConfig]')\n\n// Default refresh interval for feature flags in long-running sessions.\n// 5 minutes balances freshness with server load - flags typically don't change\n// frequently, and most sessions are shorter than this anyway.\nconst DEFAULT_REFRESH_INTERVAL = 5 * 60 * 1000\n\nexport class RemoteConfigLoader {\n private _refreshInterval: ReturnType<typeof setInterval> | undefined\n\n constructor(private readonly _instance: PostHog) {}\n\n get remoteConfig(): RemoteConfig | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.config\n }\n\n private _loadRemoteConfigJs(cb: (config?: RemoteConfig) => void): void {\n if (assignableWindow.__PosthogExtensions__?.loadExternalDependency) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'remote-config', () => {\n return cb(this.remoteConfig)\n })\n } else {\n cb()\n }\n }\n\n private _loadRemoteConfigJSON(cb: (config?: RemoteConfig) => void): void {\n this._instance._send_request({\n method: 'GET',\n url: this._instance.requestRouter.endpointFor('assets', `/array/${this._instance.config.token}/config`),\n callback: (response) => {\n cb(response.json as RemoteConfig | undefined)\n },\n })\n }\n\n load(): void {\n try {\n // Attempt 1 - use the pre-loaded config if it came as part of the token-specific array.js\n if (this.remoteConfig) {\n logger.info('Using preloaded remote config', this.remoteConfig)\n this._onRemoteConfig(this.remoteConfig)\n this._startRefreshInterval()\n return\n }\n\n if (this._instance._shouldDisableFlags()) {\n // This setting is essentially saying \"dont call external APIs\" hence we respect it here\n logger.warn('Remote config is disabled. Falling back to local config.')\n return\n }\n\n // Attempt 2 - if we have the external deps loader then lets load the script version of the config that includes site apps\n this._loadRemoteConfigJs((config) => {\n if (!config) {\n logger.info('No config found after loading remote JS config. Falling back to JSON.')\n // Attempt 3 Load the config json instead of the script - we won't get site apps etc. but we will get the config\n this._loadRemoteConfigJSON((config) => {\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n return\n }\n\n this._onRemoteConfig(config)\n this._startRefreshInterval()\n })\n } catch (error) {\n logger.error('Error loading remote config', error)\n }\n }\n\n stop(): void {\n if (this._refreshInterval) {\n clearInterval(this._refreshInterval)\n this._refreshInterval = undefined\n }\n }\n\n /**\n * Refresh feature flags for long-running sessions.\n * Calls reloadFeatureFlags() directly rather than re-fetching config — the initial\n * config load already determined whether flags are enabled, and reloadFeatureFlags()\n * is a no-op when flags are disabled. This avoids an unnecessary network round-trip.\n */\n refresh(): void {\n if (this._instance._shouldDisableFlags() || !document || document.visibilityState === 'hidden') {\n return\n }\n\n this._instance.reloadFeatureFlags()\n }\n\n private _startRefreshInterval(): void {\n if (this._refreshInterval) {\n return\n }\n\n const intervalMs = this._instance.config.remote_config_refresh_interval_ms ?? DEFAULT_REFRESH_INTERVAL\n\n // Allow users to disable periodic refresh by setting interval to 0\n if (intervalMs === 0) {\n return\n }\n\n this._refreshInterval = setInterval(() => {\n this.refresh()\n }, intervalMs)\n }\n\n private _onRemoteConfig(config?: RemoteConfig): void {\n if (!config) {\n logger.error('Failed to fetch remote config from PostHog.')\n }\n\n // Config and flags are loaded separately: config from /array/{token}/config,\n // flags from /flags/?v=2. Features like surveys, session recording, and product\n // tours reference flags in their config (e.g. survey.linked_flag_key), but this\n // is safe because those flag checks happen lazily at runtime (e.g. when deciding\n // whether to show a survey), not during config processing. By the time a linked\n // flag is evaluated, flags have already loaded.\n //\n // Even when config fails, we notify extensions so they initialize with their\n // defaults — as an explicit failure, so settings that must not fail open\n // (e.g. autocapture's opt-out) can keep their last known value.\n this._instance._onRemoteConfig(config ? { ok: true, config } : { ok: false })\n\n if (config?.hasFeatureFlags !== false) {\n if (!this._instance.config.advanced_disable_feature_flags_on_first_load) {\n this._instance.featureFlags?.ensureFlagsLoaded()\n }\n }\n }\n}\n","// Portions of this file are derived from getsentry/sentry-javascript\n// Copyright (c) 2012 Functional Software, Inc. dba Sentry\n// Licensed under the MIT License: https://github.com/getsentry/sentry-javascript/blob/develop/LICENSE\n\nimport { PostHog } from './posthog-core'\nimport { Survey } from './posthog-surveys-types'\nimport { ConversationsRemoteConfig } from './posthog-conversations-types'\n\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SAMPLED } from './extensions/replay/external/triggerMatching'\n\n// Extension class types for __extensionClasses (type-only, no bundle impact)\nimport type { ExtensionConstructor } from './extensions/types'\nimport type { Autocapture } from './autocapture'\nimport type { DeadClicksAutocapture } from './extensions/dead-clicks-autocapture'\nimport type { ExceptionObserver } from './extensions/exception-autocapture'\nimport type { HistoryAutocapture } from './extensions/history-autocapture'\nimport type { TracingHeaders } from './extensions/tracing-headers'\nimport type { WebVitalsAutocapture } from './extensions/web-vitals'\nimport type { SessionRecording } from './extensions/replay/session-recording'\nimport type { Heatmaps } from './heatmaps'\nimport type { PostHogProductTours } from './posthog-product-tours'\nimport type { SiteApps } from './site-apps'\nimport type { PostHogSurveys } from './posthog-surveys'\nimport type { Toolbar } from './extensions/toolbar'\nimport type { PostHogExceptions } from './posthog-exceptions'\nimport type { WebExperiments } from './web-experiments'\nimport type { PostHogConversations } from './extensions/conversations/posthog-conversations'\nimport type { PostHogFeatureFlags } from './posthog-featureflags'\nimport type { PostHogLogs } from './posthog-logs'\nimport type { PostHogMetrics } from './posthog-metrics'\n\n// ============================================================================\n// Re-export public types from @posthog/types\n// ============================================================================\n\n// Common types\nexport type { Property, Properties, JsonType, JsonRecord } from '@posthog/types'\n\n// Capture types\nexport type { KnownEventName, EventName, CaptureResult, CaptureOptions, BeforeSendFn } from '@posthog/types'\n\n// Feature flag types\nexport type {\n FeatureFlagsCallback,\n FeatureFlagDetail,\n FeatureFlagMetadata,\n EvaluationReason,\n FeatureFlagResult,\n FeatureFlagOptions,\n IsFeatureEnabledOptions,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeature,\n EarlyAccessFeatureStage,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n FeatureFlagOverrides,\n FeatureFlagPayloadOverrides,\n FeatureFlagOverrideOptions,\n OverrideFeatureFlagsOptions,\n} from '@posthog/types'\n\n// Request types\nexport type { Headers, RequestResponse, RequestCallback } from '@posthog/types'\n\n// Session recording types\nexport type {\n SessionRecordingCanvasOptions,\n InitiatorType,\n NetworkRequest,\n CapturedNetworkRequest,\n SessionIdChangedCallback,\n SeverityLevel,\n} from '@posthog/types'\n\n// Config types\nexport type {\n AutocaptureCompatibleElement,\n DomAutocaptureEvents,\n AutocaptureConfig,\n RageclickConfig,\n BootstrapConfig,\n SupportedWebVitalsMetrics,\n PerformanceCaptureConfig,\n DeadClickCandidate,\n ExceptionAutoCaptureConfig,\n ExceptionStepsConfig,\n DeadClicksAutoCaptureConfig,\n HeatmapConfig,\n ConfigDefaults,\n ExternalIntegrationKind,\n ErrorTrackingOptions,\n MaskInputOptions,\n SlimDOMOptions,\n SessionRecordingOptions,\n RequestQueueConfig,\n} from '@posthog/types'\n\n// Toolbar types\nexport type { ToolbarUserIntent, ToolbarSource, ToolbarVersion, ToolbarParams } from '@posthog/types'\n\n// Log capture types\nexport type {\n LogSeverityLevel,\n OtlpSeverityText,\n OtlpSeverityEntry,\n LogAttributeValue,\n LogAttributes,\n CaptureLogOptions,\n Logger,\n OtlpAnyValue,\n OtlpKeyValue,\n OtlpLogRecord,\n OtlpLogsPayload,\n} from '@posthog/types'\nexport type { LogSdkContext } from '@posthog/core'\n\n// Metric capture types\nexport type {\n MetricAttributeValue,\n MetricAttributes,\n MetricType,\n CaptureMetricOptions,\n MetricSample,\n BeforeSendMetricFn,\n OtlpMetricsPayload,\n MetricsConfig,\n} from '@posthog/types'\n\n// Re-export KnownUnsafeEditableEvent from @posthog/core for backwards compatibility\nexport type { KnownUnsafeEditableEvent } from '@posthog/core'\n\n// ============================================================================\n// Browser-specific types that depend on local imports\n// These cannot be moved to @posthog/types as they reference browser-specific code\n// ============================================================================\n\n// Import types for internal use in this file\nimport type {\n SessionRecordingCanvasOptions,\n PerformanceCaptureConfig,\n InitiatorType,\n JsonType,\n Properties,\n EventName,\n CapturedNetworkRequest,\n SessionRecordingOptions,\n FeatureFlagDetail,\n ToolbarParams,\n PostHogConfig as BasePostHogConfig,\n PostHog as BasePostHogInterface,\n RequestResponse,\n} from '@posthog/types'\n\n/* Small override from the base class to make it more specific to the browser/src/posthog-core.ts file\n * This guarantees we'll be able to use `PostHogConfig` as implemented in the browser/src/posthog-core.ts file\n * using the proper `loaded` function signature.\n */\nexport type PostHogInterface = Omit<BasePostHogInterface, 'config' | 'init' | 'set_config'> & {\n // re-declared (rather than kept from the base interface) so they use the\n // browser-specific `PostHogConfig` below, matching the class implementation\n config: PostHogConfig\n set_config(config: Partial<PostHogConfig>): void\n}\n\n/*\n * Specify that `loaded` should be using the PostHog instance type\n * as implemented by the browser/src/posthog-core.ts file rather than the @posthog/types type\n */\nexport type PostHogConfig = Omit<BasePostHogConfig, 'loaded'> & {\n loaded: (posthog: PostHogInterface) => void\n\n /**\n * Disables capturing the `$device_model` super-property.\n *\n * When capturing is enabled (the default), PostHog resolves the hardware model once during init\n * via `navigator.userAgentData.getHighEntropyValues(['model'])` and registers it as the raw OEM\n * code (e.g. `Pixel 7`). This is Chromium-only and only meaningful on Android — it resolves to\n * `undefined` on Safari/Firefox and to an empty string on desktop, in which cases nothing is\n * registered.\n *\n * This opt-out is offered because `getHighEntropyValues` is still experimental and Chromium-only\n * (not yet a cross-browser standard); set it to `true` to skip the call entirely.\n *\n * @default false\n */\n disableDeviceModel?: boolean\n\n /**\n * Internal: Extension class overrides for tree-shaking support.\n * When provided, these classes are used instead of the default imports.\n * This enables entrypoints to control which extensions are bundled.\n * @internal\n */\n __extensionClasses?: {\n exceptions?: ExtensionConstructor<PostHogExceptions>\n historyAutocapture?: ExtensionConstructor<HistoryAutocapture>\n tracingHeaders?: ExtensionConstructor<TracingHeaders>\n siteApps?: ExtensionConstructor<SiteApps>\n sessionRecording?: ExtensionConstructor<SessionRecording>\n autocapture?: ExtensionConstructor<Autocapture>\n productTours?: ExtensionConstructor<PostHogProductTours>\n heatmaps?: ExtensionConstructor<Heatmaps>\n webVitalsAutocapture?: ExtensionConstructor<WebVitalsAutocapture>\n exceptionObserver?: ExtensionConstructor<ExceptionObserver>\n deadClicksAutocapture?: ExtensionConstructor<DeadClicksAutocapture>\n surveys?: ExtensionConstructor<PostHogSurveys>\n toolbar?: ExtensionConstructor<Toolbar>\n experiments?: ExtensionConstructor<WebExperiments>\n conversations?: ExtensionConstructor<PostHogConversations>\n featureFlags?: ExtensionConstructor<PostHogFeatureFlags>\n logs?: ExtensionConstructor<PostHogLogs>\n metrics?: ExtensionConstructor<PostHogMetrics>\n }\n}\n\n// See https://nextjs.org/docs/app/api-reference/functions/fetch#fetchurl-options\ntype NextOptions = { revalidate: false | 0 | number; tags: string[] }\n\nexport interface RequestWithOptions {\n url: string\n // Data can be a single object or an array of objects when batched\n data?: Record<string, any> | Record<string, any>[]\n headers?: Record<string, any>\n transport?: 'XHR' | 'fetch' | 'sendBeacon'\n method?: 'POST' | 'GET'\n urlQueryArgs?: { compression: Compression }\n callback?: (response: RequestResponse) => void\n timeout?: number\n noRetries?: boolean\n disableTransport?: ('XHR' | 'fetch' | 'sendBeacon')[]\n compression?: Compression | 'best-available'\n /** Include the request dispatch time in a body field or query string. */\n timestampMode?: 'body' | 'query'\n fetchOptions?: {\n cache?: RequestInit['cache']\n next?: NextOptions\n }\n /**\n * When set, `_send_request` invokes `callback` with a synthetic response\n * on the paths that otherwise drop a request without notifying the caller\n * (client not loaded, server rate limit). Opt-in so existing callers keep\n * their current behavior; the logs pipeline uses it to keep records for a\n * later retry instead of losing them silently.\n */\n fireCallbackOnDrop?: boolean\n}\n\n// Queued request types - the same as a request but with additional queueing information\nexport interface QueuedRequestWithOptions extends RequestWithOptions {\n /** key of queue, e.g. 'sessionRecording' vs 'event' */\n batchKey?: string\n}\n\n// Used explicitly for retriable requests\nexport interface RetriableRequestWithOptions extends QueuedRequestWithOptions {\n retriesPerformedSoFar?: number\n}\n\nexport type FlagVariant = { flag: string; variant: string }\n\n/** the config stored in persistence when session recording remote config is received */\nexport type SessionRecordingPersistedConfig = Omit<\n SessionRecordingRemoteConfig,\n | 'recordCanvas'\n | 'canvasFps'\n | 'canvasQuality'\n | 'networkPayloadCapture'\n | 'sampleRate'\n | 'minimumDurationMilliseconds'\n> & {\n /**\n * Used to determine if the persisted config is still valid or we need to wait for a new one\n * only accepts undefined since older versions of the library didn't set this.\n */\n cache_timestamp?: number\n enabled: boolean\n networkPayloadCapture: SessionRecordingRemoteConfig['networkPayloadCapture'] & {\n capturePerformance: RemoteConfig['capturePerformance']\n }\n canvasRecording: {\n enabled: SessionRecordingRemoteConfig['recordCanvas']\n fps: SessionRecordingRemoteConfig['canvasFps']\n quality: SessionRecordingRemoteConfig['canvasQuality']\n }\n // we don't allow string config here\n sampleRate: number | null\n minimumDurationMilliseconds: number | null | undefined\n}\n\nexport type SessionRecordingRemoteConfig = SessionRecordingCanvasOptions & {\n endpoint?: string\n consoleLogRecordingEnabled?: boolean\n // the API returns a decimal between 0 and 1 as a string\n sampleRate?: string | null\n minimumDurationMilliseconds?: number\n linkedFlag?: string | FlagVariant | null\n networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n masking?: Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>\n urlTriggers?: SessionRecordingUrlTrigger[]\n scriptConfig?: { script?: string | undefined }\n urlBlocklist?: SessionRecordingUrlTrigger[]\n eventTriggers?: string[]\n /**\n * Controls how event, url, sampling, and linked flag triggers are combined\n *\n * `any` means that if any of the triggers match, the session will be recorded\n * `all` means that all the triggers must match for the session to be recorded\n *\n * originally it was (event || url) && (sampling || linked flag)\n * which nobody wanted, now the default is all\n */\n triggerMatchType?: 'any' | 'all'\n /**\n * Config version - defaults to 1 (legacy)\n * When version is 2, triggerGroups is used instead of individual trigger fields\n */\n version?: 1 | 2\n /**\n * V2 Trigger Groups - multiple named trigger groups with their own conditions and sample rates\n * Only used when version === 2\n */\n triggerGroups?: SessionRecordingTriggerGroup[]\n}\n\n/**\n * Outcome of a remote config fetch: the config, or an explicit failure.\n * @internal\n */\nexport type RemoteConfigResult = { ok: true; config: RemoteConfig } | { ok: false }\n\n/**\n * Remote configuration for the PostHog instance\n *\n * All of these settings can be configured directly in your PostHog instance\n * Any configuration set in the client overrides the information from the server\n */\nexport interface RemoteConfig {\n /**\n * Supported compression algorithms\n */\n supportedCompression: Compression[]\n\n /**\n * If true, disables autocapture. When absent or not a boolean, the SDK\n * keeps the last known server value; a visitor with no stored value\n * keeps autocapture off until a response containing the field arrives.\n */\n autocapture_opt_out?: boolean\n\n /**\n * originally capturePerformance was replay only and so boolean true\n * is equivalent to { network_timing: true }\n * now capture performance can be separately enabled within replay\n * and as a standalone web vitals tracker\n * people can have them enabled separately\n * they work standalone but enhance each other\n * TODO: deprecate this so we make a new config that doesn't need this explanation\n */\n capturePerformance?: boolean | PerformanceCaptureConfig\n\n /**\n * Whether we should use a custom endpoint for analytics\n *\n * @default { endpoint: \"/e\" }\n */\n analytics?: {\n endpoint?: string\n }\n\n /**\n * Whether the `$elements_chain` property should be sent as a string or as an array\n *\n * @default false\n */\n elementsChainAsString?: boolean\n\n /**\n * Error tracking configuration options\n */\n errorTracking?: {\n autocaptureExceptions?: boolean\n captureExtensionExceptions?: boolean\n suppressionRules?: ErrorTrackingSuppressionRule[]\n }\n\n /**\n * Whether capturing logs to the logs product is enabled\n */\n logs?: {\n captureConsoleLogs?: boolean\n }\n\n /**\n * This is currently in development and may have breaking changes without a major version bump\n */\n autocaptureExceptions?: boolean | { endpoint?: string }\n\n /**\n * Session recording configuration options\n */\n sessionRecording?: SessionRecordingRemoteConfig | false\n\n /**\n * Whether surveys are enabled\n */\n surveys?: boolean | Survey[]\n\n /**\n * Whether product tours are enabled\n */\n productTours?: boolean\n\n /**\n * Parameters for the toolbar\n */\n toolbarParams: ToolbarParams\n\n /**\n * @deprecated renamed to toolbarParams, still present on older API responses\n */\n editorParams?: ToolbarParams\n\n /**\n * @deprecated, moved to toolbarParams\n */\n toolbarVersion: 'toolbar'\n\n /**\n * Whether the user is authenticated\n */\n isAuthenticated: boolean\n\n /**\n * List of site apps with their IDs and URLs\n */\n siteApps: { id: string; url: string }[]\n\n /**\n * Whether heatmaps are enabled\n */\n heatmaps?: boolean\n\n /**\n * Whether to only capture identified users by default\n */\n defaultIdentifiedOnly?: boolean\n\n /**\n * Whether to capture dead clicks\n */\n captureDeadClicks?: boolean\n\n /**\n * Indicates if the team has any flags enabled (if not we don't need to load them)\n */\n hasFeatureFlags?: boolean\n\n /**\n * Conversations widget configuration\n */\n conversations?: boolean | ConversationsRemoteConfig\n}\n\n/**\n * Flags returns feature flags and their payloads\n */\nexport interface FlagsResponse extends RemoteConfig {\n featureFlags: Record<string, string | boolean>\n featureFlagPayloads: Record<string, JsonType>\n errorsWhileComputingFlags: boolean\n requestId?: string\n flags: Record<string, FeatureFlagDetail>\n evaluatedAt?: number\n /**\n * Server-controlled gate for minimal `$feature_flag_called` events. `true` only when the\n * project opted in; omitted otherwise. Absence always means full events.\n */\n minimalFlagCalledEvents?: boolean\n}\n\nexport type SiteAppGlobals = {\n event: {\n uuid: string\n event: EventName\n properties: Properties\n timestamp?: Date\n elements_chain?: string\n distinct_id?: string\n }\n person: {\n properties: Properties\n }\n groups: Record<string, { id: string; type: string; properties: Properties }>\n}\n\nexport type SiteAppLoader = {\n id: string\n init: (config: { posthog: PostHog; callback: (success: boolean) => void }) => {\n processEvent?: (globals: SiteAppGlobals) => void\n }\n}\n\nexport type SiteApp = {\n id: string\n loaded: boolean\n errored: boolean\n processedBuffer: boolean\n processEvent?: (globals: SiteAppGlobals) => void\n}\n\nexport interface PersistentStore {\n _is_supported: () => boolean\n _error: (error: any) => void\n _parse: (name: string) => any\n _get: (name: string) => any\n // Returns whether the write was accepted without throwing. Backends that\n // swallow quota/serialization errors return false so callers can avoid\n // caching a write that never landed. This is best-effort, not a durable\n // -persistence guarantee — e.g. Safari private mode has historically\n // reported success on a write that did not persist.\n _set: (\n name: string,\n value: any,\n expire_days?: number | null,\n cross_subdomain?: boolean,\n secure?: boolean,\n debug?: boolean\n ) => boolean\n _remove: (name: string, cross_subdomain?: boolean) => void\n}\n\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type NetworkRecordOptions = {\n initiatorTypes?: InitiatorType[]\n maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n recordHeaders?: boolean | { request: boolean; response: boolean }\n recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n recordInitialRequests?: boolean\n /**\n * whether to record PerformanceEntry events for network requests\n */\n recordPerformance?: boolean\n /**\n * the PerformanceObserver will only observe these entry types\n */\n performanceEntryTypeToObserve: string[]\n /**\n * the maximum size of the request/response body to record\n * NB this will be at most 1MB even if set larger\n */\n payloadSizeLimitBytes: number\n /**\n * when true, read bodies through a streaming reader that stops at payloadSizeLimitBytes\n * instead of buffering the whole body and then enforcing the limit. Reads only a clone of\n * the body, so it never consumes the stream the page itself reads.\n * @default false\n */\n streamNetworkBody?: boolean\n /**\n * some domains we should never record the payload\n * for example other companies session replay ingestion payloads aren't super useful but are gigantic\n * if this isn't provided we use a default list\n * if this is provided - we add the provided list to the default list\n * i.e. we never record the payloads on the default deny list\n */\n payloadHostDenyList?: string[]\n}\n\nexport type ErrorEventArgs = [\n event: string | Event,\n source?: string | undefined,\n lineno?: number | undefined,\n colno?: number | undefined,\n error?: Error | undefined,\n]\n\n// levels originally copied from Sentry to work with the sentry integration\n// and to avoid relying on a frequently changing @sentry/types dependency\n// but provided as an array of literal types, so we can constrain the level below\nexport const severityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'] as const\n\nexport interface SessionRecordingUrlTrigger {\n url: string\n matching: 'regex'\n}\n\n/**\n * V2 event trigger - always an object with name, optionally with property filters.\n * The server normalizes bare event name strings to this shape before sending.\n */\nexport interface SessionRecordingEventTrigger {\n name: string\n properties?: SessionRecordingTriggerPropertyFilter[]\n}\n\nexport interface SessionRecordingTriggerPropertyFilter {\n key: string\n type: 'event' | 'person'\n operator?: 'exact' | 'is_not' | 'icontains' | 'not_icontains' | 'regex' | 'not_regex' | 'gt' | 'lt'\n value?: string | number | boolean | string[]\n}\n\n/**\n * V2 Trigger Group - represents a single trigger group with its own conditions and sample rate\n */\nexport interface SessionRecordingTriggerGroup {\n id: string\n name: string\n sampleRate: number\n minDurationMs?: number\n conditions: {\n matchType: 'any' | 'all'\n events?: SessionRecordingEventTrigger[]\n urls?: SessionRecordingUrlTrigger[]\n flag?: string | FlagVariant\n properties?: SessionRecordingTriggerPropertyFilter[]\n }\n}\n\nexport type PropertyMatchType = 'regex' | 'not_regex' | 'exact' | 'is_not' | 'icontains' | 'not_icontains'\n\nexport interface ErrorTrackingSuppressionRule {\n type: 'AND' | 'OR'\n values: ErrorTrackingSuppressionRuleValue[]\n}\n\nexport interface ErrorTrackingSuppressionRuleValue {\n key: '$exception_types' | '$exception_values'\n operator: PropertyMatchType\n value: string | string[]\n type: string\n}\n\nexport type SessionStartReason =\n | 'sampling_overridden'\n | 'recording_initialized'\n | 'linked_flag_matched'\n | 'linked_flag_overridden'\n | typeof SAMPLED\n | 'session_id_changed'\n | 'url_trigger_matched'\n | 'event_trigger_matched'\n\nexport type OverrideConfig = {\n sampling: boolean\n linked_flag: boolean\n url_trigger: boolean\n event_trigger: boolean\n}\n\nexport const Compression = {\n GZipJS: 'gzip-js',\n Base64: 'base64',\n} as const\nexport type Compression = (typeof Compression)[keyof typeof Compression]\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n var w = new Worker(u);\n w.onerror = function (e) { return cb(e.error, null); };\n w.onmessage = function (e) { return cb(null, e.data); };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i)\n co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) >> 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n // source length\n var sl = dat.length;\n // have to estimate size\n var noBuf = !buf || st;\n // no state\n var noSt = !st || st.i;\n if (!st)\n st = {};\n // Assumes roughly 33% compression ratio average\n if (!buf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n st.f = final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n throw 'unexpected EOF';\n break;\n }\n // ensure size\n if (noBuf)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >>> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n throw 'invalid block type';\n if (pos > tbts)\n throw 'unexpected EOF';\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17;\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var mxa = lbt + dbt + 18;\n while (noSt || pos + mxa < tbts) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts)\n throw 'unexpected EOF';\n if (!c)\n throw 'invalid length/literal';\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw 'invalid distance';\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n }\n if (pos > tbts)\n throw 'unexpected EOF';\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = pos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [new u8(0), 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = (syms[i] >>> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n // end\n var e = i + 65535;\n if (e < s) {\n // write full block\n pos = wfblk(w, pos, dat.subarray(i, e));\n }\n else {\n // write final block\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n }\n else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new u32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx bitpos\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768\n var imod = i & 32767;\n // previous index with this value\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = (i - dif + j + 32768) & 32767;\n var pti = prev[ti];\n var cd = (ti - pti + 32768) & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += (imod - pimod + 32768) & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one Uint32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n // this is the easiest way to avoid needing to maintain state\n if (!lst)\n pos = wfblk(w, pos, et);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new u32(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = 0xFFFFFFFF;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return c ^ 0xFFFFFFFF; }\n };\n};\n// Alder32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 5552, l);\n for (; i < e; ++i)\n n += d[i], m += n;\n n %= 65521, m %= 65521;\n }\n a = n, b = m;\n },\n d: function () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n var _a;\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n ch[id] = wcln(fns[m], fnStr, td_1);\n }\n var td = mrg({}, ch[id][1]);\n return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n if (!opts.consume)\n dat = new u8(dat);\n w.postMessage([dat, opts], [dat.buffer]);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.push = function (d, f) {\n if (t)\n throw 'stream finished';\n if (!strm.ondata)\n throw 'no stream handler';\n w.postMessage([d, t = f], [d.buffer]);\n };\n strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n throw 'invalid gzip data';\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += d[10] | (d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n throw 'invalid zlib data';\n if (d[1] & 32)\n throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (!cb && typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, !f), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n this.d = final;\n this.p(chunk, final || false);\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n /**\n * Creates an inflation stream\n * @param cb The callback to call whenever data is inflated\n */\n function Inflate(cb) {\n this.s = {};\n this.p = new u8(0);\n this.ondata = cb;\n }\n Inflate.prototype.e = function (c) {\n if (this.d)\n throw 'stream finished';\n if (!this.ondata)\n throw 'no stream handler';\n var l = this.p.length;\n var n = new u8(l + c.length);\n n.set(this.p), n.set(c, l), this.p = n;\n };\n Inflate.prototype.c = function (final) {\n this.d = this.s.i = final || false;\n var bts = this.s.b;\n var dt = inflt(this.p, this.o, this.s);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous inflation stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncInflate(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, 0, function () {\n var strm = new Inflate();\n onmessage = astrm(strm);\n }, 7);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n this.c.p(c);\n this.l += c.length;\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n /**\n * Creates a GUNZIP stream\n * @param cb The callback to call whenever data is inflated\n */\n function Gunzip(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n var s = gzs(this.p);\n if (s >= this.p.length && !final)\n return;\n this.p = this.p.subarray(s), this.v = 0;\n }\n if (final) {\n if (this.p.length < 8)\n throw 'invalid gzip stream';\n this.p = this.p.subarray(0, -8);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous GUNZIP stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncGunzip(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, 0, function () {\n var strm = new Gunzip();\n onmessage = astrm(strm);\n }, 9);\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n this.c.p(c);\n var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n /**\n * Creates a Zlib decompression stream\n * @param cb The callback to call whenever data is inflated\n */\n function Unzlib(cb) {\n this.v = 1;\n Inflate.call(this, cb);\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 2 && !final)\n return;\n this.p = this.p.subarray(2), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n throw 'invalid zlib stream';\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous Zlib decompression stream\n * @param cb The callback to call whenever data is deflated\n */\n function AsyncUnzlib(cb) {\n this.ondata = cb;\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, 0, function () {\n var strm = new Unzlib();\n onmessage = astrm(strm);\n }, 11);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function Decompress(cb) {\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n throw 'no stream handler';\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n var _this_1 = this;\n var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(cb)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(cb)\n : new this.Z(cb);\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous decompression stream\n * @param cb The callback to call whenever data is decompressed\n */\n function AsyncDecompress(cb) {\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, out)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, out)\n : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k;\n if (val instanceof u8)\n t[n] = [val, o];\n else if (Array.isArray(val))\n t[n] = [val[0], mrg(o, val[1])];\n else\n fltn(val, n + '/', t, o);\n }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n var l = str.length;\n if (!latin1 && typeof TextEncoder != 'undefined')\n return new TextEncoder().encode(str);\n var ar = new u8(str.length + (str.length >>> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >>> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >>> 18)), w(128 | ((c >>> 12) & 63)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >>> 12)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n var r = '';\n if (!latin1 && typeof TextDecoder != 'undefined')\n return new TextDecoder().decode(dat);\n for (var i = 0; i < dat.length;) {\n var c = dat[i++];\n if (c < 128 || latin1)\n r += String.fromCharCode(c);\n else if (c < 224)\n r += String.fromCharCode((c & 31) << 6 | (dat[i++] & 63));\n else if (c < 240)\n r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63));\n else\n c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n ;\n return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n var fl = fn.length, l = cmp.length;\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b] = 20, b += 2;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n d[b] = t, b += 2;\n var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n throw 'date not in range 1980-2099';\n wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n b += 4;\n wbytes(d, b, c);\n wbytes(d, b + 4, l);\n wbytes(d, b + 8, su);\n wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n if (ce != null)\n wbytes(d, b += 10, ce), b += 4;\n d.set(fn, b);\n b += fl;\n if (ce == null)\n d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n throw 'no callback';\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n }\n catch (e) {\n return cb(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cb(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), m = file.length;\n c.p(file);\n var n = strToU8(fn), s = n.length;\n var t = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n var l = d.length;\n files[i] = {\n t: t,\n d: d,\n m: m,\n c: c.d(),\n u: fn.length != l,\n n: n,\n p: p\n };\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n if (!--lft)\n cbf();\n }\n };\n if (n.length > 65535)\n cbl('filename too long', null);\n if (!t)\n cbl(null, file);\n else if (m < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (opts === void 0) { opts = {}; }\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var t = p.level == 0 ? 0 : 8;\n var n = strToU8(fn), s = n.length;\n if (n.length > 65535)\n throw 'filename too long';\n var d = t ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push({\n t: t,\n d: d,\n m: file.length,\n c: c.d(),\n u: fn.length != s,\n n: n,\n o: o,\n p: p\n });\n o += 30 + s + l;\n tot += 76 + 2 * s + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n if (typeof cb != 'function')\n throw 'no callback';\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cb('invalid zip file', null);\n return;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (!lft)\n cb(null, {});\n var c = lft;\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = lft = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n var _loop_2 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cb(e, null);\n }\n else {\n files[fn] = d;\n if (!--lft)\n cb(null, files);\n }\n };\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n if (sc < 320000) {\n try {\n cbl(null, inflateSync(infl, new u8(su)));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl('unknown compression type ' + c_1, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_2(i);\n }\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n throw 'invalid zip file';\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = o == 4294967295;\n if (z) {\n e = b4(data, e - 12);\n if (b4(data, e) != 0x6064B50)\n throw 'invalid zip file';\n c = b4(data, e + 32);\n o = b4(data, e + 48);\n }\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n else\n throw 'unknown compression type ' + c_2;\n }\n return files;\n}\n","import { each, find } from '@posthog/browser-common/utils/general-utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport {\n convertToURL,\n formDataToQuery,\n getQueryParam,\n jsonStringify,\n} from '@posthog/browser-common/utils/request-utils'\n\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport {\n AbortController,\n CompressionStream,\n fetch,\n navigator,\n XMLHttpRequest,\n} from '@posthog/browser-common/utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from '@posthog/browser-common/utils/encode-utils'\nimport {\n gzipCompress,\n isArray,\n isGzipData,\n isGzipRequest,\n isNativeAsyncGzipError,\n isNativeAsyncGzipReadError,\n isUndefined,\n} from '@posthog/core'\n\nexport { jsonStringify }\n\ninterface RequestWithEncodedBody extends RequestWithOptions {\n _encodedBody?: EncodedBody\n}\n\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\nlet nativeAsyncGzipDisabled = false\n\nconst removeURLParam = (url: string, param: string): string => {\n const [urlWithoutHash, hash] = url.split('#')\n const [baseUrl, search] = urlWithoutHash.split('?')\n\n if (!search) {\n return url\n }\n\n const updatedSearch = search\n .split('&')\n .filter((pair) => pair.split('=')[0] !== param)\n .join('&')\n\n return `${baseUrl}${updatedSearch ? `?${updatedSearch}` : ''}${hash ? `#${hash}` : ''}`\n}\n\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart | ArrayBuffer\n estimatedSize: number\n}\n\ntype EncodedRequest = {\n url: string\n encodedBody?: EncodedBody\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n const updatedSearch =\n search?.split('&').map((pair) => {\n const [key, origValue] = pair.split('=')\n const value = replace ? (newParams[key] ?? origValue) : origValue\n delete newParams[key]\n return `${key}=${value}`\n }) ?? []\n\n const remaining = formDataToQuery(newParams)\n if (remaining) {\n updatedSearch.push(remaining)\n }\n\n return updatedSearch.length > 0 ? `${baseUrl}?${updatedSearch.join('&')}` : baseUrl\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = (options: RequestWithEncodedBody): EncodedBody | undefined => {\n // Use pre-encoded body if available (set by async compression in the request entrypoint)\n if (options._encodedBody) {\n return options._encodedBody\n }\n\n const { data, compression } = options\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: gzipData.buffer.slice(gzipData.byteOffset, gzipData.byteOffset + gzipData.byteLength) as ArrayBuffer,\n estimatedSize: gzipData.byteLength,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst encodePostDataSafely = (options: RequestWithEncodedBody): EncodedRequest => {\n const fallbackToUncompressed = (): EncodedRequest => {\n // beacon bodies must keep a CORS-simple content type even on the gzip-failure\n // fallback — uncompressed application/json preflights, base64 form data does not\n if (options.transport === 'sendBeacon') {\n return {\n url: extendURLParams(options.url, { compression: Compression.Base64 }),\n encodedBody: encodePostData({\n ...options,\n compression: Compression.Base64,\n _encodedBody: undefined,\n }),\n }\n }\n\n return {\n url: removeURLParam(options.url, 'compression'),\n encodedBody: encodePostData({\n ...options,\n compression: undefined,\n _encodedBody: undefined,\n }),\n }\n }\n\n let encodedBody: EncodedBody | undefined\n try {\n encodedBody = encodePostData(options)\n } catch (error) {\n if (isGzipRequest(options.compression, getQueryParam(options.url, 'compression'))) {\n logger.error('Failed to gzip request body, sending uncompressed payload', error)\n return fallbackToUncompressed()\n }\n\n throw error\n }\n\n if (\n !encodedBody ||\n !isGzipRequest(options.compression, getQueryParam(options.url, 'compression')) ||\n isGzipData(encodedBody.body)\n ) {\n return { url: options.url, encodedBody }\n }\n\n nativeAsyncGzipDisabled = true\n return fallbackToUncompressed()\n}\n\nconst encodeRequest = (options: RequestWithEncodedBody): EncodedRequest | undefined => {\n try {\n return encodePostDataSafely(options)\n } catch (error) {\n logger.error(error)\n options.callback?.({ statusCode: 0, error })\n return undefined\n }\n}\n\n/**\n * Pre-encode the request body using async native CompressionStream.\n * This avoids blocking the main thread with fflate's synchronous gzip,\n * which can take 300ms+ on constrained devices.\n *\n * Callers must check preconditions (data exists, gzip compression, CompressionStream available)\n * before calling this function.\n */\nconst preEncodeAsync = async (options: RequestWithEncodedBody): Promise<RequestWithEncodedBody> => {\n const jsonData = jsonStringify(options.data)\n const compressed = await gzipCompress(jsonData, Config.DEBUG, { rethrow: true })\n if (!compressed) {\n return options\n }\n const body = await compressed.arrayBuffer()\n\n return {\n ...options,\n _encodedBody: {\n contentType: CONTENT_TYPE_PLAIN,\n body,\n estimatedSize: body.byteLength,\n },\n }\n}\n\n/**\n * Builds the reason used when aborting a fetch because our own request timeout elapsed.\n * It keeps `name === 'AbortError'` (so callers that detect timeouts by error name keep working)\n * but carries a descriptive message, so it is never a reason-less\n * `signal is aborted without reason` exception.\n */\nconst timeoutAbortReason = (timeout?: number): Error => {\n const reason = new Error(`PostHog request timed out${timeout ? ` after ${timeout}ms` : ''}`)\n reason.name = 'AbortError'\n return reason\n}\n\n// A failed fetch at the network layer (ad blocker, dropped connection, CORS, page teardown)\n// rejects with a generic `TypeError` whose message varies by browser - Chrome\n// `Failed to fetch`, Firefox `NetworkError when attempting to fetch resource.`, Safari\n// `Load failed`. These are expected, retried failures rather than genuine errors, so we\n// log them at `warn` rather than `error`.\nconst NETWORK_ERROR_MESSAGES = /Failed to fetch|NetworkError|Load failed/i\nconst isExpectedNetworkError = (error: unknown): boolean => {\n const err = error as Error | undefined\n return err?.name === 'TypeError' && NETWORK_ERROR_MESSAGES.test(err?.message || '')\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const encodedRequest = encodeRequest(options)\n if (!encodedRequest) {\n return\n }\n\n const req = new XMLHttpRequest!()\n const { url, encodedBody } = encodedRequest\n req.open(options.method || 'GET', url, true)\n const { contentType, body } = encodedBody ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions & { _keepaliveDisabled?: boolean }) => {\n const encodedRequest = encodeRequest(options)\n if (!encodedRequest) {\n return\n }\n\n const { url, encodedBody } = encodedRequest\n const { contentType, body, estimatedSize } = encodedBody ?? {}\n\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n // Set the instant our own timeout fires, before the abort propagates. This is the source of\n // truth for \"we timed out ourselves\" - see the `.catch` below for why we can't rely on the\n // abort reason.\n let timedOut = false\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => {\n timedOut = true\n // Abort with an explicit reason. Without one, the browser rejects the fetch with a\n // reason-less `DOMException: AbortError: signal is aborted without reason`, which is\n // indistinguishable from a host app's own aborted fetches wherever it surfaces (the\n // `{ statusCode: 0, error }` callback, logs, stack traces). An explicit reason makes\n // our own request timeouts identifiable. We keep `name === 'AbortError'` so existing\n // timeout handling (e.g. feature flag timeout detection) keeps working.\n controller.abort(timeoutAbortReason(options.timeout))\n }, options.timeout),\n }\n }\n\n const handleError = (error: any) => {\n // Detect our own timeout via the `timedOut` flag rather than by comparing `error`\n // against the reason we passed to `controller.abort(...)`. Not every browser propagates\n // the abort reason to the fetch rejection - some reject with a generic native\n // `DOMException: AbortError: The operation was aborted.` instead - so a reference (or\n // message) comparison misses those and misclassifies our own timeout as a real error.\n // The flag is set synchronously the instant our timeout fires, and we additionally\n // require `name === 'AbortError'` so a genuine network error that happens to settle\n // just after the timeout is never mislabelled.\n if ((timedOut && (error as Error)?.name === 'AbortError') || isExpectedNetworkError(error)) {\n // Expected, benign failures the request queue already retries - our own request\n // timeout (an intentional abort), or a network-level `TypeError` (ad blocker,\n // dropped connection, CORS, page teardown). Neither is a genuine failure, so log\n // at `warn` rather than `error`. (For setups running with debug logging and\n // `capture_console_errors` both enabled, this also keeps them out of error\n // tracking's console-error capture.)\n logger.warn(error)\n } else {\n logger.error(error)\n }\n options.callback?.({ statusCode: 0, error })\n }\n\n try {\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n // _keepaliveDisabled: a beacon-rejected payload would fail a keepalive fetch too (shared quota)\n keepalive:\n options.method === 'POST' && !options._keepaliveDisabled && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch(handleError)\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n } catch (error) {\n // `window.fetch` can be monkey-patched by third-party scripts (e.g. a storefront/analytics\n // wrapper) to throw *synchronously* instead of returning a rejected promise. Because we may\n // call `_fetch` synchronously inside the host app's call stack (e.g. web experiments loaded\n // via `onFeatureFlags`), that throw would otherwise escape as an unhandled exception and\n // pollute error tracking. Route it through the same handling as an async rejection so the\n // request queue just retries. `.finally()` never runs when the call throws synchronously,\n // so clear the timeout here too.\n if (aborter) {\n clearTimeout(aborter.timeout)\n }\n handleError(error)\n }\n\n return\n}\n\n// below this size a rejection means the shared quota is exhausted, not that the payload is too big\nconst BEACON_SPLIT_FLOOR_BYTES = 16 * 1024\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n try {\n const { url, encodedBody } = encodePostDataSafely(options)\n const { contentType, body, estimatedSize } = encodedBody ?? {}\n if (!body) {\n return\n }\n // sendBeacon requires a Blob to set the Content-Type header correctly.\n // Without wrapping, ArrayBuffer bodies are sent with no Content-Type,\n // which can cause issues with proxies/WAFs that require it.\n const sendBeaconBody = body instanceof Blob ? body : new Blob([body], { type: contentType })\n if (navigator!.sendBeacon!(url, sendBeaconBody)) {\n return\n }\n\n // rejected: over the page's shared ~64KiB in-flight keepalive quota\n // (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch) — halve so what fits still delivers\n if (isArray(options.data) && options.data.length > 1 && (estimatedSize ?? 0) > BEACON_SPLIT_FLOOR_BYTES) {\n const mid = Math.ceil(options.data.length / 2)\n _sendBeacon({ ...options, data: options.data.slice(0, mid) })\n _sendBeacon({ ...options, data: options.data.slice(mid) })\n return\n }\n\n logger.warn(`Beacon of ~${estimatedSize ?? 0} bytes was rejected by the browser, falling back to fetch`)\n _fetch({ ...options, _keepaliveDisabled: true })\n } catch (error) {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n logger.warn('Beacon send failed', error)\n }\n}\n\nconst VERSIONLESS_ENDPOINTS = ['/e/', '/s/']\n\nconst getURLPath = (url: string): string => {\n const parsedURL = convertToURL(url)\n const path = parsedURL?.pathname || url.split(/[?#]/)[0]\n\n return path ? (path[0] === '/' ? path : `/${path}`) : '/'\n}\n\nconst hasEndpointSuffix = (path: string, endpoint: string): boolean => {\n return path.slice(path.length - endpoint.length) === endpoint\n}\n\nconst isVersionlessEndpoint = (url: string): boolean => {\n const path = getURLPath(url)\n\n return VERSIONLESS_ENDPOINTS.some((endpoint) => hasEndpointSuffix(path, endpoint))\n}\n\nconst buildRequestURL = (\n url: string,\n method: RequestWithOptions['method'],\n compression?: RequestWithOptions['compression'],\n timestampMode?: RequestWithOptions['timestampMode']\n): string => {\n const versionlessEndpoint = isVersionlessEndpoint(url)\n const requestURL = versionlessEndpoint ? removeURLParam(url, 'ver') : url\n const timestampParam = timestampMode === 'query' ? (method === 'POST' ? 'sent_at' : '_') : undefined\n\n return extendURLParams(\n compression === Compression.GZipJS ? removeURLParam(requestURL, 'compression') : requestURL,\n {\n ...(timestampParam ? { [timestampParam]: Date.now().toString() } : {}),\n ...(versionlessEndpoint ? {} : { ver: Config.JS_SDK_VERSION }),\n ...(compression === Compression.GZipJS ? {} : { compression }),\n }\n )\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options: RequestWithEncodedBody = { ..._options }\n options.timeout = options.timeout || 60000\n\n const transport = options.transport ?? 'fetch'\n\n // beacons fire during page unload, where a CORS preflight cannot complete — the body\n // must keep a CORS-simple content type, which uncompressed (application/json) is not\n if (transport === 'sendBeacon' && isUndefined(options.compression) && options.data) {\n options.compression = Compression.Base64\n }\n\n if (options.timestampMode === 'body' && options.method === 'POST' && options.data && !isArray(options.data)) {\n options.data = { ...options.data, sent_at: new Date().toISOString() }\n }\n\n options.url = buildRequestURL(options.url, options.method, options.compression, options.timestampMode)\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n // For non-sendBeacon transports, use async native CompressionStream when available\n // to avoid blocking the main thread with fflate's synchronous gzip (which can take 300ms+).\n // sendBeacon must remain synchronous as it's used during page unload.\n if (\n transport !== 'sendBeacon' &&\n options.data &&\n options.compression === Compression.GZipJS &&\n !!CompressionStream &&\n typeof Promise !== 'undefined' &&\n !nativeAsyncGzipDisabled\n ) {\n preEncodeAsync(options)\n .then((encodedOptions) => {\n transportMethod(encodedOptions)\n })\n .catch((error) => {\n if (isNativeAsyncGzipReadError(error)) {\n nativeAsyncGzipDisabled = true\n transportMethod({\n ...options,\n compression: undefined,\n url: buildRequestURL(_options.url, _options.method, undefined, _options.timestampMode),\n })\n return\n }\n\n if (isNativeAsyncGzipError(error)) {\n nativeAsyncGzipDisabled = true\n }\n\n // If async compression fails for another reason, fall back to the synchronous fflate path\n transportMethod(options)\n })\n } else {\n transportMethod(options)\n }\n}\n","function _base64Encode(data) {\n if (!data) return data;\n return btoa(encodeURIComponent(data).replace(/%([0-9A-F]{2})/g, (_, p1)=>String.fromCharCode(parseInt(p1, 16))));\n}\nexport { _base64Encode };\n","import { QueuedRequestWithOptions, RequestQueueConfig } from './types'\nimport { each } from '@posthog/browser-common/utils/general-utils'\n\nimport { isArray, isUndefined, clampToRange } from '@posthog/core'\nimport { logger } from '@posthog/browser-common/utils/logger'\n\nexport const DEFAULT_FLUSH_INTERVAL_MS = 3000\n\nexport class RequestQueue {\n // We start in a paused state and only start flushing when enabled by the parent\n private _isPaused: boolean = true\n private _queue: QueuedRequestWithOptions[] = []\n private _flushTimeout?: ReturnType<typeof setTimeout>\n private _flushTimeoutMs: number\n private _sendRequest: (req: QueuedRequestWithOptions) => void\n\n constructor(sendRequest: (req: QueuedRequestWithOptions) => void, config?: RequestQueueConfig) {\n this._flushTimeoutMs = clampToRange(\n config?.flush_interval_ms || DEFAULT_FLUSH_INTERVAL_MS,\n 250,\n 5000,\n logger.createLogger('flush interval'),\n DEFAULT_FLUSH_INTERVAL_MS\n )\n this._sendRequest = sendRequest\n }\n\n enqueue(req: QueuedRequestWithOptions): void {\n this._queue.push(req)\n\n if (!this._flushTimeout) {\n this._setFlushTimeout()\n }\n }\n\n unload(): void {\n this._clearFlushTimeout()\n const requests = this._queue.length > 0 ? this._formatQueue() : {}\n const requestValues = Object.values(requests)\n\n // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n const sortedRequests = [\n ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n ]\n sortedRequests.map((req) => {\n this._sendRequestSafely({ ...req, transport: 'sendBeacon' })\n })\n }\n\n enable(): void {\n this._isPaused = false\n this._setFlushTimeout()\n }\n\n private _setFlushTimeout(): void {\n if (this._isPaused) {\n return\n }\n this._flushTimeout = setTimeout(() => {\n this._clearFlushTimeout()\n if (this._queue.length > 0) {\n const requests = this._formatQueue()\n for (const key in requests) {\n const req = requests[key]\n const now = new Date().getTime()\n\n if (req.data && isArray(req.data)) {\n each(req.data, (data) => {\n data['offset'] = Math.abs(data['timestamp'] - now)\n delete data['timestamp']\n })\n }\n this._sendRequestSafely(req)\n }\n }\n }, this._flushTimeoutMs)\n }\n\n private _sendRequestSafely(req: QueuedRequestWithOptions): void {\n try {\n this._sendRequest(req)\n } catch (error) {\n logger.error(error)\n }\n }\n\n private _clearFlushTimeout(): void {\n clearTimeout(this._flushTimeout)\n this._flushTimeout = undefined\n }\n\n private _formatQueue(): Record<string, QueuedRequestWithOptions> {\n const requests: Record<string, QueuedRequestWithOptions> = {}\n each(this._queue, (request: QueuedRequestWithOptions) => {\n const req = request\n const key = (req ? req.batchKey : null) || req.url\n if (isUndefined(requests[key])) {\n // TODO: What about this -it seems to batch data into an array - do we always want that?\n requests[key] = { ...req, data: [] }\n }\n\n requests[key].data?.push(req.data)\n })\n\n this._queue = []\n return requests\n }\n}\n","import { RetriableRequestWithOptions } from './types'\n\nimport { isPositiveNumber, isUndefined } from '@posthog/core'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport { PostHog } from './posthog-core'\nimport { extendURLParams } from './request'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\n\nconst thirtyMinutes = 30 * 60 * 1000\nconst DEFAULT_MAX_RETRIES = 10\n// NOTE: posthog-logs.ts mirrors this budget with its own `MAX_CONSECUTIVE_STATUS_ZERO_FAILURES`.\n// Keep the constant value and the warning copy in sync.\nconst STATUS_CODE_ZERO_MAX_RETRIES = 3\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\ninterface RetryQueueElement {\n retryAt: number\n requestOptions: RetriableRequestWithOptions\n}\n\nexport class RetryQueue {\n private _isPolling: boolean = false\n private _poller: number | undefined\n private _pollIntervalMs: number = 3000\n private _queue: RetryQueueElement[] = []\n private _areWeOnline: boolean\n private _onlineListener: (() => void) | undefined\n private _offlineListener: (() => void) | undefined\n\n constructor(private _instance: PostHog) {\n this._queue = []\n this._areWeOnline = true\n\n if (!isUndefined(window) && 'onLine' in window.navigator) {\n this._areWeOnline = window.navigator.onLine\n\n this._onlineListener = () => {\n this._areWeOnline = true\n this._flush()\n }\n\n this._offlineListener = () => {\n this._areWeOnline = false\n }\n\n addEventListener(window, 'online', this._onlineListener)\n addEventListener(window, 'offline', this._offlineListener)\n }\n }\n\n get length() {\n return this._queue.length\n }\n\n retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void {\n if (isPositiveNumber(retriesPerformedSoFar)) {\n options.url = extendURLParams(options.url, { retry_count: retriesPerformedSoFar })\n }\n\n this._instance._send_request({\n ...options,\n callback: (response) => {\n if (response.statusCode !== 200 && (response.statusCode < 400 || response.statusCode >= 500)) {\n const maxRetries = response.statusCode === 0 ? STATUS_CODE_ZERO_MAX_RETRIES : DEFAULT_MAX_RETRIES\n\n if ((retriesPerformedSoFar ?? 0) < maxRetries) {\n this._enqueue({\n retriesPerformedSoFar,\n ...options,\n })\n return\n }\n\n if (response.statusCode === 0) {\n logger.warn(\n `Request failed before receiving an HTTP response; this can happen due to network issues, CORS, browser blocking, or ad blockers. Stopped retrying after ${retriesPerformedSoFar ?? 0} retries.`\n )\n }\n }\n\n options.callback?.(response)\n },\n })\n }\n\n private _enqueue(requestOptions: RetriableRequestWithOptions): void {\n const retriesPerformedSoFar = requestOptions.retriesPerformedSoFar || 0\n requestOptions.retriesPerformedSoFar = retriesPerformedSoFar + 1\n\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = Date.now() + msToNextRetry\n\n this._queue.push({ retryAt, requestOptions })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this._isPolling) {\n this._isPolling = true\n this._poll()\n }\n }\n\n private _poll(): void {\n this._poller && clearTimeout(this._poller)\n\n if (this._queue.length === 0) {\n this._isPolling = false\n this._poller = undefined\n return\n }\n\n this._poller = setTimeout(() => {\n if (this._areWeOnline && this._queue.length > 0) {\n this._flush()\n }\n this._poll()\n }, this._pollIntervalMs) as any as number\n }\n\n private _flush(): void {\n const now = Date.now()\n const notToFlush: RetryQueueElement[] = []\n const toFlush = this._queue.filter((item) => {\n if (item.retryAt < now) {\n return true\n }\n notToFlush.push(item)\n return false\n })\n\n this._queue = notToFlush\n\n if (toFlush.length > 0) {\n for (const { requestOptions } of toFlush) {\n this.retriableRequest(requestOptions)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n this._isPolling = false\n\n if (!isUndefined(window)) {\n if (this._onlineListener) {\n window.removeEventListener('online', this._onlineListener)\n this._onlineListener = undefined\n }\n if (this._offlineListener) {\n window.removeEventListener('offline', this._offlineListener)\n this._offlineListener = undefined\n }\n }\n\n for (const { requestOptions } of this._queue) {\n try {\n // we've had send beacon in place for at least 2 years\n this._instance._send_request({\n ...requestOptions,\n transport: 'sendBeacon',\n })\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n logger.error(e)\n }\n }\n this._queue = []\n }\n}\n","import { window } from '@posthog/browser-common/utils/globals'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { isArray } from '@posthog/core'\n\nexport interface ScrollContext {\n // scroll is how far down the page the user has scrolled,\n // content is how far down the page the user can view content\n // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n // and they don't scroll at all, then scroll is 0 and content is 500)\n maxScrollHeight?: number\n maxScrollY?: number\n lastScrollY?: number\n maxContentHeight?: number\n maxContentY?: number\n lastContentY?: number\n}\n\n// This class is responsible for tracking scroll events and maintaining the scroll context\nexport class ScrollManager {\n private _context: ScrollContext | undefined\n\n constructor(private _instance: PostHog) {}\n\n private get _scrollRoot() {\n return this._instance.config.scroll_root_selector\n }\n\n getContext(): ScrollContext | undefined {\n return this._context\n }\n\n resetContext(): ScrollContext | undefined {\n const ctx = this._context\n\n // update the scroll properties for the new page, but wait until the next tick\n // of the event loop\n setTimeout(this._updateScrollData, 0)\n\n return ctx\n }\n\n private _updateScrollData = () => {\n if (!this._context) {\n this._context = {}\n }\n\n const el = this.scrollElement()\n\n const scrollY = this.scrollY()\n const scrollHeight = el ? Math.max(0, el.scrollHeight - el.clientHeight) : 0\n const contentY = scrollY + (el?.clientHeight || 0)\n const contentHeight = el?.scrollHeight || 0\n\n this._context.lastScrollY = Math.ceil(scrollY)\n this._context.maxScrollY = Math.max(scrollY, this._context.maxScrollY ?? 0)\n this._context.maxScrollHeight = Math.max(scrollHeight, this._context.maxScrollHeight ?? 0)\n\n this._context.lastContentY = contentY\n this._context.maxContentY = Math.max(contentY, this._context.maxContentY ?? 0)\n this._context.maxContentHeight = Math.max(contentHeight, this._context.maxContentHeight ?? 0)\n }\n\n // `capture: true` is required to get scroll events for other scrollable elements\n // on the page, not just the window\n // see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n startMeasuringScrollPosition() {\n addEventListener(window, 'scroll', this._updateScrollData, { capture: true })\n addEventListener(window, 'scrollend', this._updateScrollData, { capture: true })\n addEventListener(window, 'resize', this._updateScrollData)\n }\n\n public scrollElement(): Element | undefined {\n if (this._scrollRoot) {\n const selectors = isArray(this._scrollRoot) ? this._scrollRoot : [this._scrollRoot]\n for (const selector of selectors) {\n const element = window?.document.querySelector(selector)\n if (element) {\n return element\n }\n }\n return undefined\n } else {\n return window?.document.documentElement\n }\n }\n\n private _scrollPosition(axis: 'x' | 'y'): number {\n const elementKey = axis === 'y' ? 'scrollTop' : 'scrollLeft'\n if (this._scrollRoot) {\n const element = this.scrollElement()\n return (element && element[elementKey]) || 0\n }\n\n if (!window) {\n return 0\n }\n return axis === 'y'\n ? window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0\n : window.scrollX || window.pageXOffset || window.document.documentElement.scrollLeft || 0\n }\n\n public scrollY(): number {\n return this._scrollPosition('y')\n }\n\n public scrollX(): number {\n return this._scrollPosition('x')\n }\n}\n","/* Store some session-level attribution-related properties in the persistence layer\n *\n * These have the same lifespan as a session_id, meaning that if the session_id changes, these properties will be reset.\n *\n * We only store the entry URL and referrer, and derive many props (such as utm tags) from those.\n *\n * Given that the cookie is limited to 4K bytes, we don't want to store too much data, so we chose not to store device\n * properties (such as browser, OS, etc) here, as usually getting the current value of those from event properties is\n * sufficient.\n */\nimport { getPersonInfo, getPersonPropsFromInfo } from '@posthog/browser-common/utils/event-utils'\nimport type { SessionIdManager } from './sessionid'\nimport type { PostHogPersistence } from './posthog-persistence'\nimport { CLIENT_SESSION_PROPS } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { each, stripEmptyProperties } from '@posthog/browser-common/utils/general-utils'\nimport { stripLeadingDollar } from '@posthog/core'\n\ninterface LegacySessionSourceProps {\n initialPathName: string\n referringDomain: string // Is actually referring host, but named referring domain for internal consistency. Should contain a port if there is one.\n utm_medium?: string\n utm_source?: string\n utm_campaign?: string\n utm_content?: string\n utm_term?: string\n}\n\ninterface CurrentSessionSourceProps {\n r: string // Referring host\n u: string | undefined // full URL\n}\n\ninterface StoredSessionSourceProps {\n sessionId: string\n props: LegacySessionSourceProps | CurrentSessionSourceProps\n}\n\nconst generateSessionSourceParams = (posthog?: PostHog): LegacySessionSourceProps | CurrentSessionSourceProps => {\n return getPersonInfo(\n posthog?.config.mask_personal_data_properties,\n posthog?.config.custom_personal_data_properties,\n posthog?.config.disable_capture_url_hashes\n )\n}\n\nexport class SessionPropsManager {\n private readonly _instance: PostHog\n private readonly _sessionIdManager: SessionIdManager\n private readonly _persistence: PostHogPersistence\n private readonly _sessionSourceParamGenerator: (\n instance?: PostHog\n ) => LegacySessionSourceProps | CurrentSessionSourceProps\n\n constructor(\n instance: PostHog,\n sessionIdManager: SessionIdManager,\n persistence: PostHogPersistence,\n sessionSourceParamGenerator?: (instance?: PostHog) => LegacySessionSourceProps | CurrentSessionSourceProps\n ) {\n this._instance = instance\n this._sessionIdManager = sessionIdManager\n this._persistence = persistence\n this._sessionSourceParamGenerator = sessionSourceParamGenerator || generateSessionSourceParams\n\n this._sessionIdManager.onSessionId(this._onSessionIdCallback)\n }\n\n _getStored(): StoredSessionSourceProps | undefined {\n return this._persistence.props[CLIENT_SESSION_PROPS]\n }\n\n _onSessionIdCallback = (sessionId: string) => {\n const stored = this._getStored()\n if (stored && stored.sessionId === sessionId) {\n return\n }\n\n const newProps: StoredSessionSourceProps = {\n sessionId,\n props: this._sessionSourceParamGenerator(this._instance),\n }\n this._persistence.register({ [CLIENT_SESSION_PROPS]: newProps })\n }\n\n getSetOnceProps() {\n const p = this._getStored()?.props\n if (!p) {\n return {}\n }\n if ('r' in p) {\n return getPersonPropsFromInfo(p, this._instance.config.disable_capture_url_hashes)\n } else {\n return {\n $referring_domain: p.referringDomain,\n $pathname: p.initialPathName,\n utm_source: p.utm_source,\n utm_campaign: p.utm_campaign,\n utm_medium: p.utm_medium,\n utm_content: p.utm_content,\n utm_term: p.utm_term,\n }\n }\n }\n\n getSessionProps() {\n // it's the same props, but don't include null for unset properties, and add a prefix\n const p: Record<string, any> = {}\n each(stripEmptyProperties(this.getSetOnceProps()), (v, k) => {\n if (k === '$current_url') {\n // $session_entry_current_url would be a weird name, call it $session_entry_url instead\n k = 'url'\n }\n p[`$session_entry_${stripLeadingDollar(k)}`] = v\n })\n return p\n }\n}\n","class SimpleEventEmitter {\n on(event, listener) {\n if (!this._events[event]) this._events[event] = [];\n this._events[event].push(listener);\n return ()=>{\n this._events[event] = this._events[event].filter((x)=>x !== listener);\n };\n }\n emit(event, payload) {\n for (const listener of this._events[event] || [])listener(payload);\n for (const listener of this._events['*'] || [])listener(event, payload);\n }\n constructor(){\n this._events = {};\n }\n}\nexport { SimpleEventEmitter };\n","import { PostHogPersistence } from './posthog-persistence'\nimport { COOKIELESS_ALWAYS, DOM_EVENT_BEFOREUNLOAD, SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuid7ToTimestampMs, uuidv7 } from '@posthog/browser-common/utils/uuidv7'\nimport { window } from '@posthog/browser-common/utils/globals'\n\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nimport { isArray, isNull, isUndefined, clampToRange, isPositiveNumber } from '@posthog/core'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { SimpleEventEmitter } from '@posthog/browser-common/utils/simple-event-emitter'\n\nconst logger = createLogger('[SessionId]')\n\nexport const DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS = 30 * 60 // 30 minutes\nexport const MAX_SESSION_IDLE_TIMEOUT_SECONDS = 10 * 60 * 60 // 10 hours\nexport const MIN_SESSION_IDLE_TIMEOUT_SECONDS = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT_MILLISECONDS = 24 * 3600 * 1000 // 24 hours\n\n// Must stay well under MIN_SESSION_IDLE_TIMEOUT_SECONDS so idle detection on\n// other tabs cannot fire on stale persisted data (pinned by a unit test).\n// Tradeoff: sibling tabs only observe activity once it has been persisted —\n// in-memory ticks within this window are invisible across tabs.\nexport const ACTIVITY_TIMESTAMP_PERSIST_GRANULARITY_MS = 5_000\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private _config: Partial<PostHogConfig>\n private _persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private _lastPersistedActivityTimestamp: number | null = null\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n private readonly _sessionTimeoutMs: number\n\n // we track activity so we can end the session proactively when it has passed the idle timeout\n private _enforceIdleTimeout: ReturnType<typeof setTimeout> | undefined\n\n private _beforeUnloadListener: (() => void) | undefined = undefined\n // Flipped to true by `destroy()` so a setTimeout callback that is\n // already queued can't re-arm itself onto a torn-down instance.\n private _destroyed: boolean = false\n\n private _eventEmitter: SimpleEventEmitter = new SimpleEventEmitter()\n public on(event: 'forcedIdleReset', handler: () => void): () => void {\n return this._eventEmitter.on(event, handler)\n }\n\n constructor(instance: PostHog, sessionIdGenerator?: () => string, windowIdGenerator?: () => string) {\n if (!instance.persistence) {\n throw new Error('SessionIdManager requires a PostHogPersistence instance')\n }\n if (instance.config.cookieless_mode === COOKIELESS_ALWAYS) {\n throw new Error('SessionIdManager cannot be used with cookieless_mode=\"always\"')\n }\n\n this._config = instance.config\n this._persistence = instance.persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = this._config['persistence_name'] || this._config['token']\n\n const desiredTimeout = this._config['session_idle_timeout_seconds'] || DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n this._sessionTimeoutMs =\n clampToRange(\n desiredTimeout,\n MIN_SESSION_IDLE_TIMEOUT_SECONDS,\n MAX_SESSION_IDLE_TIMEOUT_SECONDS,\n logger.createLogger('session_idle_timeout_seconds'),\n DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n ) * 1000\n\n instance.register({ $configured_session_timeout_ms: this._sessionTimeoutMs })\n this._resetIdleTimer()\n\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore._parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore._parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore._remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore._set(this._primary_window_exists_storage_key, true)\n }\n\n if (this._config.bootstrap?.sessionID) {\n try {\n const sessionStartTimestamp = uuid7ToTimestampMs(this._config.bootstrap.sessionID)\n this._setSessionId(this._config.bootstrap.sessionID, new Date().getTime(), sessionStartTimestamp)\n } catch (e) {\n logger.error('Invalid sessionID in bootstrap', e)\n }\n }\n\n this._listenToReloadWindow()\n }\n\n get sessionTimeoutMs(): number {\n return this._sessionTimeoutMs\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this._config.persistence !== 'memory' && !this._persistence._disabled && sessionStore._is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore._set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore._parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n private _isActivityChangeBelowGranularity(newActivityTimestamp: number | null): boolean {\n const lastPersisted = this._lastPersistedActivityTimestamp\n if (isNull(lastPersisted) || isNull(newActivityTimestamp)) {\n return false\n }\n // Math.abs guards against clock skew (NTP, devtools time travel) — a\n // backwards jump would otherwise slip past the gate.\n return Math.abs(newActivityTimestamp - lastPersisted) < ACTIVITY_TIMESTAMP_PERSIST_GRANULARITY_MS\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n const idChanged = sessionId !== this._sessionId\n const startChanged = sessionStartTimestamp !== this._sessionStartTimestamp\n const activityChanged = sessionActivityTimestamp !== this._sessionActivityTimestamp\n const isActivityOnlyChange = !idChanged && !startChanged\n\n // In-memory state always tracks the freshest values, even when the\n // write below is throttled, so in-process reads stay accurate.\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n if (isActivityOnlyChange && !activityChanged) {\n return\n }\n\n if (isActivityOnlyChange && this._isActivityChangeBelowGranularity(sessionActivityTimestamp)) {\n return\n }\n\n this._lastPersistedActivityTimestamp = sessionActivityTimestamp\n this._persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n\n // Gates the debounce-specific cross-tab storage mechanics. The cross-tab\n // refresh on the idle path, the idle-timer re-arm, sibling-session\n // adoption, and `onSessionId` emission all run for all callers — only the\n // per-key SESSION_ID refresh (vs the legacy whole-blob flush()+load(),\n // which can only clobber a sibling when there is a pending debounced\n // write) is gated on debounce being enabled. The dated default\n // (>= 2026-05-30) enables debounce, so the per-key path ships with it;\n // debounce-disabled callers keep the safe legacy refresh.\n private _useCrossTabRefreshHardening(): boolean {\n const debounce = this._config?.persistence_save_debounce_ms\n return isPositiveNumber(debounce) && debounce > 0\n }\n\n // Refresh this tab's SESSION_ID view from storage to pick up a sibling\n // tab's writes. With debounce enabled, pull only the SESSION_ID slot — a\n // whole-blob flush() would clobber the sibling's SESSION_ID write before\n // we read it. With debounce disabled, flush() is a no-op (no pending\n // timer) so the legacy whole-blob load() is safe and picks up sibling\n // writes.\n private _refreshSessionIdFromStorage(): void {\n if (this._useCrossTabRefreshHardening()) {\n this._persistence.refreshKey(SESSION_ID)\n } else {\n this._persistence.flush()\n this._persistence.load()\n }\n }\n\n // Called from destroy / beforeunload so a tab close inside the throttle\n // window doesn't leave the persisted activity timestamp stale.\n private _flushPendingActivityTimestamp(): void {\n if (\n isNull(this._sessionActivityTimestamp) ||\n this._sessionActivityTimestamp === this._lastPersistedActivityTimestamp\n ) {\n return\n }\n\n // A sibling tab may have rotated the session — refresh and skip the\n // write if storage no longer matches our cached id/start, otherwise\n // we would clobber the sibling's new session with stale values.\n this._refreshSessionIdFromStorage()\n const [, persistedSessionId, persistedStart] = this._getSessionId()\n if (persistedSessionId !== this._sessionId || persistedStart !== this._sessionStartTimestamp) {\n return\n }\n\n this._lastPersistedActivityTimestamp = this._sessionActivityTimestamp\n this._persistence.register({\n [SESSION_ID]: [this._sessionActivityTimestamp, this._sessionId ?? null, this._sessionStartTimestamp],\n })\n // Force the write past the debounce — destroy / unload paths cannot\n // wait for a deferred timer that will never fire.\n this._persistence.flush()\n }\n\n // `max` because either view can be ahead: the throttle holds in-memory\n // ahead of persisted, and a sibling tab can hold persisted ahead of a\n // frozen in-memory.\n private _freshestActivityTimestamp(): number {\n const [persistedActivity] = this._getSessionId()\n const persisted = isPositiveNumber(persistedActivity) ? persistedActivity : 0\n const inMemory = isPositiveNumber(this._sessionActivityTimestamp) ? this._sessionActivityTimestamp : 0\n return Math.max(persisted, inMemory)\n }\n\n // PostHogPersistence does not listen for `storage` events, so this tab's\n // cached props lag sibling tabs' writes. Refresh before deciding idle so a\n // sibling keeping the session alive isn't seen as idle here.\n private _isSessionIdleAfterCrossTabRefresh(timestamp: number): boolean {\n this._refreshSessionIdFromStorage()\n return this._sessionHasBeenIdleTooLong(timestamp, this._freshestActivityTimestamp())\n }\n\n private _getSessionId(): [number, string, number] {\n // Always read from persistence - it's the source of truth\n // The in-memory cache could become stale (e.g., in a frozen tab scenario where\n // time passes but the cache isn't updated)\n const sessionIdInfo = this._persistence.props[SESSION_ID]\n\n if (isArray(sessionIdInfo) && sessionIdInfo.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionIdInfo.push(sessionIdInfo[0])\n }\n\n return sessionIdInfo || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated. Also clears the idle timer so a stale fire\n // cannot rotate the freshly-cleared session.\n resetSessionId(): void {\n this._lastPersistedActivityTimestamp = null\n clearTimeout(this._enforceIdleTimeout)\n this._enforceIdleTimeout = undefined\n this._setSessionId(null, null, null)\n }\n\n /**\n * Cleans up resources used by SessionIdManager.\n * Should be called when the SessionIdManager is no longer needed to prevent memory leaks.\n */\n destroy(): void {\n this._destroyed = true\n this._flushPendingActivityTimestamp()\n\n // Clear the idle timeout timer\n clearTimeout(this._enforceIdleTimeout)\n this._enforceIdleTimeout = undefined\n\n // Remove the beforeunload event listener\n if (this._beforeUnloadListener && window) {\n window.removeEventListener(DOM_EVENT_BEFOREUNLOAD, this._beforeUnloadListener, { capture: false } as any)\n this._beforeUnloadListener = undefined\n }\n\n // Clear session id changed handlers\n this._sessionIdChangedHandlers = []\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n this._beforeUnloadListener = () => {\n this._flushPendingActivityTimestamp()\n if (this._canUseSessionStorage()) {\n sessionStore._remove(this._primary_window_exists_storage_key)\n }\n }\n addEventListener(window, DOM_EVENT_BEFOREUNLOAD, this._beforeUnloadListener, { capture: false })\n }\n\n private _sessionHasBeenIdleTooLong = (timestamp: unknown, lastActivityTimestamp: unknown): boolean => {\n if (!isPositiveNumber(timestamp) || !isPositiveNumber(lastActivityTimestamp)) {\n return false\n }\n return Math.abs(timestamp - lastActivityTimestamp) > this.sessionTimeoutMs\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n throw new Error('checkAndGetSessionAndWindowId should not be called with cookieless_mode=\"always\"')\n }\n const timestamp = _timestamp || new Date().getTime()\n\n let [, sessionId, startTimestamp] = this._getSessionId()\n const lastActivityTimestamp = this._freshestActivityTimestamp()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n isPositiveNumber(startTimestamp) && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT_MILLISECONDS\n\n let valuesChanged = false\n let crossTabAdoption = false\n const noSessionId = !sessionId\n const preRefreshSessionId = sessionId\n let activityTimeout =\n !noSessionId && !readOnly && this._sessionHasBeenIdleTooLong(timestamp, lastActivityTimestamp)\n if (activityTimeout) {\n // Re-check against the freshest cross-tab view: a sibling tab\n // may have kept the session alive.\n activityTimeout = this._isSessionIdleAfterCrossTabRefresh(timestamp)\n if (!activityTimeout) {\n // The rare, timing-dependent case this path exists for: a\n // sibling kept the session alive, so we avoid a spurious\n // rotation. Logged because it is otherwise invisible in the\n // wild and hard to reproduce.\n logger.info('cross-tab refresh kept the session alive', { sessionId })\n }\n // The cross-tab refresh may have observed a sibling tab's\n // session rotation. Re-sample sessionId / startTimestamp so we\n // don't clobber the sibling's new session with our stale id when\n // we write below. (`_flushPendingActivityTimestamp` re-reads the\n // same way on the unload path, but bails instead of adopting.)\n ;[, sessionId, startTimestamp] = this._getSessionId()\n }\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n logger.info('new session ID generated', {\n sessionId,\n windowId,\n changeReason: { noSessionId, activityTimeout, sessionPastMaximumLength },\n })\n startTimestamp = timestamp\n valuesChanged = true\n } else {\n if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n // Not gated on debounce: the refresh + re-sample above run for all\n // callers, so adoption can happen for all callers — and a session id\n // change that handlers don't hear about leaves consumers (page-view\n // state, a stopped recorder, session-scoped props) on the old\n // session. If we adopted, we must notify.\n crossTabAdoption = sessionId !== preRefreshSessionId\n if (crossTabAdoption) {\n // We took a sibling tab's session id (keeping our own window\n // id). Fire handlers so downstream consumers (session\n // recorder, session-scoped props, $pageview) follow the new\n // session.\n logger.info('adopted cross-tab session id', { sessionId, windowId })\n valuesChanged = true\n }\n }\n\n const noActivityTimestamp = !isPositiveNumber(lastActivityTimestamp)\n const shouldPreserveActivityTimestamp = !noActivityTimestamp && readOnly && !sessionPastMaximumLength\n const newActivityTimestamp = shouldPreserveActivityTimestamp ? lastActivityTimestamp : timestamp\n\n const noStartTimestamp = !isPositiveNumber(startTimestamp)\n const sessionStartTimestamp = noStartTimestamp ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newActivityTimestamp, sessionStartTimestamp)\n\n if (!readOnly) {\n this._resetIdleTimer()\n }\n\n const changeReason = { noSessionId, activityTimeout, sessionPastMaximumLength, crossTabAdoption }\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) => handler(sessionId, windowId, changeReason))\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n changeReason: valuesChanged ? changeReason : undefined,\n lastActivityTimestamp: lastActivityTimestamp,\n }\n }\n\n private _resetIdleTimer() {\n if (this._destroyed) {\n // The instance has been torn down. Don't schedule any more\n // work — a setTimeout callback queued before destroy could\n // otherwise re-arm onto a dead manager and fire after teardown.\n return\n }\n clearTimeout(this._enforceIdleTimeout)\n this._enforceIdleTimeout = setTimeout(() => {\n if (this._destroyed) {\n return\n }\n if (this._isSessionIdleAfterCrossTabRefresh(new Date().getTime())) {\n const idleSessionId = this._sessionId\n this.resetSessionId()\n this._eventEmitter.emit('forcedIdleReset', { idleSessionId })\n } else {\n // A sibling tab kept the session alive — re-arm so we\n // re-check after another timeout window. This is unbounded by\n // design: a session with at least one active tab re-arms\n // indefinitely until every tab goes idle (or is destroyed —\n // guarded by the check above). We deliberately do NOT adopt a\n // sibling's rotated id here; adoption is scoped to the event\n // path (checkAndGetSessionAndWindowId), and this tab picks up\n // any rotation on its next event.\n this._resetIdleTimer()\n }\n }, this.sessionTimeoutMs * 1.1)\n }\n}\n","import { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from \"@posthog/core\";\nconst isLikelyBot = function(navigator, customBlockedUserAgents) {\n if (!navigator) return false;\n const ua = navigator.userAgent;\n if (ua) {\n if (isBlockedUA(ua, customBlockedUserAgents)) return true;\n }\n try {\n const uaData = navigator?.userAgentData;\n if (uaData?.brands && uaData.brands.some((brandObj)=>isBlockedUA(brandObj?.brand, customBlockedUserAgents))) return true;\n } catch {}\n return !!navigator.webdriver;\n};\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA, isLikelyBot };\n","import { isString } from \"@posthog/core\";\nimport { navigator as external_globals_mjs_navigator } from \"./globals.mjs\";\nimport { logger } from \"./logger.mjs\";\nasync function getDeviceModel() {\n const uaData = external_globals_mjs_navigator?.userAgentData;\n if (!uaData?.getHighEntropyValues) return;\n try {\n const hints = await uaData.getHighEntropyValues([\n 'model'\n ]);\n const model = hints?.model;\n return isString(model) && model.length > 0 ? model : void 0;\n } catch (e) {\n logger.info('Unable to resolve $device_model from userAgentData.getHighEntropyValues', e);\n return;\n }\n}\nexport { getDeviceModel };\n","const isValidRegex = function(str) {\n try {\n new RegExp(str);\n } catch {\n return false;\n }\n return true;\n};\nconst isMatchingRegex = function(value, pattern) {\n if (!isValidRegex(pattern)) return false;\n try {\n return new RegExp(pattern).test(value);\n } catch {\n return false;\n }\n};\nexport { isMatchingRegex, isValidRegex };\n","import { isArray, isNull, isUndefined } from \"@posthog/core\";\nimport { jsonStringify } from \"./request-utils.mjs\";\nimport { isMatchingRegex } from \"./regex-utils.mjs\";\nfunction getPersonPropertiesHash(distinct_id, userPropertiesToSet, userPropertiesToSetOnce) {\n return jsonStringify({\n distinct_id,\n userPropertiesToSet,\n userPropertiesToSetOnce\n });\n}\nconst propertyComparisons = {\n exact: (targets, values)=>values.some((value)=>targets.some((target)=>value === target)),\n is_not: (targets, values)=>values.every((value)=>targets.every((target)=>value !== target)),\n regex: (targets, values)=>values.some((value)=>targets.some((target)=>isMatchingRegex(value, target))),\n not_regex: (targets, values)=>values.every((value)=>targets.every((target)=>!isMatchingRegex(value, target))),\n icontains: (targets, values)=>values.map(toLowerCase).some((value)=>targets.map(toLowerCase).some((target)=>value.includes(target))),\n not_icontains: (targets, values)=>values.map(toLowerCase).every((value)=>targets.map(toLowerCase).every((target)=>!value.includes(target))),\n gt: (targets, values)=>values.some((value)=>{\n const numValue = parseFloat(value);\n return !isNaN(numValue) && targets.some((t)=>numValue > parseFloat(t));\n }),\n lt: (targets, values)=>values.some((value)=>{\n const numValue = parseFloat(value);\n return !isNaN(numValue) && targets.some((t)=>numValue < parseFloat(t));\n })\n};\nconst toLowerCase = (v)=>v.toLowerCase();\nconst NEGATIVE_OPERATORS = new Set([\n 'is_not',\n 'not_icontains',\n 'not_regex'\n]);\nfunction matchTriggerPropertyFilters(filters, eventProperties, personProperties) {\n if (!filters || 0 === filters.length) return true;\n return filters.every((filter)=>{\n const source = 'person' === filter.type ? personProperties : eventProperties;\n const propertyValue = source?.[filter.key];\n const operator = filter.operator || 'exact';\n if (isUndefined(propertyValue) || isNull(propertyValue)) return NEGATIVE_OPERATORS.has(operator);\n const comparisonFunction = propertyComparisons[operator];\n if (!comparisonFunction) return false;\n if (isUndefined(filter.value) || isNull(filter.value)) return false;\n const targetValues = isArray(filter.value) ? filter.value.map(String) : [\n String(filter.value)\n ];\n const actualValues = isArray(propertyValue) ? propertyValue.map(String) : [\n String(propertyValue)\n ];\n return comparisonFunction(targetValues, actualValues);\n });\n}\nfunction matchPropertyFilters(propertyFilters, eventProperties) {\n if (!propertyFilters) return true;\n return Object.entries(propertyFilters).every(([propertyName, filter])=>{\n const eventPropertyValue = eventProperties?.[propertyName];\n if (isUndefined(eventPropertyValue) || isNull(eventPropertyValue)) return false;\n const eventValues = [\n String(eventPropertyValue)\n ];\n const comparisonFunction = propertyComparisons[filter.operator];\n if (!comparisonFunction) return false;\n return comparisonFunction(filter.values, eventValues);\n });\n}\nexport { getPersonPropertiesHash, matchPropertyFilters, matchTriggerPropertyFilters, propertyComparisons };\n","import { PostHog } from '../posthog-core'\n\n/**\n * The request router helps simplify the logic to determine which endpoints should be called for which things\n * The basic idea is that for a given region (US or EU), we have a set of endpoints that we should call depending\n * on the type of request (events, replays, flags, etc.) and handle overrides that may come from configs or the flags endpoint\n */\n\nexport const RequestRouterRegion = {\n US: 'us',\n EU: 'eu',\n CUSTOM: 'custom',\n} as const\nexport type RequestRouterRegion = (typeof RequestRouterRegion)[keyof typeof RequestRouterRegion]\n\nexport type RequestRouterTarget = 'api' | 'ui' | 'assets' | 'flags'\n\nconst ingestionDomain = 'i.posthog.com'\nconst staticAssetPath = /^\\/static\\//\n\nexport class RequestRouter {\n instance: PostHog\n private _regionCache: Record<string, RequestRouterRegion> = {}\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n get apiHost(): string {\n const host = this.instance.config.api_host.trim().replace(/\\/$/, '')\n if (host === 'https://app.posthog.com') {\n return 'https://us.i.posthog.com'\n }\n return host\n }\n\n get flagsApiHost(): string {\n const customHost = this.instance.config.flags_api_host\n if (customHost) {\n return customHost.trim().replace(/\\/$/, '')\n }\n // Backwards compatibility: if no custom flags_api_host is set, fall back to the regular apiHost\n return this.apiHost\n }\n\n get uiHost(): string | undefined {\n let host = this.instance.config.ui_host?.replace(/\\/$/, '')\n\n if (!host) {\n // No ui_host set, get it from the api_host. But api_host differs\n // from the actual UI host, so replace the ingestion subdomain with just posthog.com\n host = this.apiHost.replace(`.${ingestionDomain}`, '.posthog.com')\n }\n\n if (host === 'https://app.posthog.com') {\n return 'https://us.posthog.com'\n }\n\n return host\n }\n\n get region(): RequestRouterRegion {\n // We don't need to compute this every time so we cache the result\n if (!this._regionCache[this.apiHost]) {\n if (/https:\\/\\/(app|us|us-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.US\n } else if (/https:\\/\\/(eu|eu-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n this._regionCache[this.apiHost] = RequestRouterRegion.EU\n } else {\n this._regionCache[this.apiHost] = RequestRouterRegion.CUSTOM\n }\n }\n return this._regionCache[this.apiHost]\n }\n\n private _staticAssetHostOverride(path: string): string | undefined {\n if (!staticAssetPath.test(path)) {\n return undefined\n }\n\n const override = this.instance.config.asset_host\n if (typeof override !== 'string') {\n return undefined\n }\n\n const normalizedOverride = override.trim().replace(/\\/$/, '')\n return normalizedOverride || undefined\n }\n\n endpointFor(target: RequestRouterTarget, path: string = ''): string {\n if (path) {\n path = path[0] === '/' ? path : `/${path}`\n }\n\n if (target === 'ui') {\n return this.uiHost + path\n }\n\n if (target === 'flags') {\n return this.flagsApiHost + path\n }\n\n if (target === 'assets') {\n const assetHostOverride = this._staticAssetHostOverride(path)\n if (assetHostOverride) {\n return `${assetHostOverride}${path}`\n }\n }\n\n if (this.region === RequestRouterRegion.CUSTOM) {\n return this.apiHost + path\n }\n\n const suffix = ingestionDomain + path\n\n switch (target) {\n case 'assets':\n return `https://${this.region}-assets.${suffix}`\n case 'api':\n return `https://${this.region}.${suffix}`\n }\n }\n}\n","import { SurveySchedule } from \"../types.mjs\";\nfunction doesSurveyActivateByEvent(survey) {\n return !!survey.conditions?.events?.values?.length;\n}\nfunction canSurveyActivateRepeatedly(survey) {\n return doesSurveyActivateByEvent(survey) && !!survey.conditions?.events?.repeatedActivation || survey.schedule === SurveySchedule.Always;\n}\nexport { canSurveyActivateRepeatedly, doesSurveyActivateByEvent };\n","import { getSurveyIterationKey } from '@posthog/core/surveys'\n\nimport { DisplaySurveyOptions, Survey, SurveyType, DisplaySurveyType } from '../posthog-surveys-types'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nexport { doesSurveyActivateByEvent, getSurveyInteractionProperty } from '@posthog/core/surveys'\n\nexport const SURVEY_LOGGER = createLogger('[Surveys]')\n\nexport function isSurveyRunning(survey: Survey): boolean {\n return !!(survey.start_date && !survey.end_date)\n}\n\nexport function doesSurveyActivateByAction(survey: Pick<Survey, 'conditions'>): boolean {\n return !!survey.conditions?.actions?.values?.length\n}\n\nexport const SURVEY_SEEN_PREFIX = 'seenSurvey_'\nexport const SURVEY_IN_PROGRESS_PREFIX = 'inProgressSurvey_'\nexport const SURVEY_ABANDONED_PREFIX = 'abandonedSurvey_'\n\n// Prefix namespacing is a localStorage concern, so it stays in the browser package;\n// the iteration-qualified key itself is shared with the other SDKs via @posthog/core.\nexport const getSurveyStorageKey = (prefix: string, survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return `${prefix}${getSurveyIterationKey(survey)}`\n}\n\nexport const getSurveySeenKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_SEEN_PREFIX, survey)\n}\n\nexport const getSurveyAbandonedKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n return getSurveyStorageKey(SURVEY_ABANDONED_PREFIX, survey)\n}\n\nexport const setSurveySeenOnLocalStorage = (survey: Pick<Survey, 'id' | 'current_iteration'>) => {\n try {\n const surveySeenKey = getSurveySeenKey(survey)\n const isSurveySeen = localStorage.getItem(surveySeenKey)\n // if survey is already seen, no need to set it again\n if (isSurveySeen) {\n return\n }\n\n localStorage.setItem(surveySeenKey, 'true')\n } catch (error) {\n SURVEY_LOGGER.error('Failed to persist survey seen state', error)\n }\n}\n\n// These surveys are relevant for the getActiveMatchingSurveys method. They are used to\n// display surveys in our customer's application. Any new in-app survey type should be added here.\nexport const IN_APP_SURVEY_TYPES: SurveyType[] = [SurveyType.Popover, SurveyType.Widget, SurveyType.API]\n\nexport const DEFAULT_DISPLAY_SURVEY_OPTIONS: DisplaySurveyOptions = {\n ignoreConditions: false,\n ignoreDelay: false,\n displayType: DisplaySurveyType.Popover,\n}\n","function isSurveyKeyForSurvey(key, surveyId) {\n return key === surveyId || key.startsWith(`${surveyId}_`);\n}\nfunction getSurveyIterationKey(survey) {\n if (survey.current_iteration && survey.current_iteration > 0) return `${survey.id}_${survey.current_iteration}`;\n return survey.id;\n}\nexport { getSurveyIterationKey, isSurveyKeyForSurvey };\n","import { PostHog } from '../posthog-core'\nimport { ExternalIntegrationKind } from '../types'\nimport { assignableWindow, ExternalExtensionKind } from '../utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nconst logger = createLogger('[PostHog ExternalIntegrations]')\n\nconst MAPPED_INTEGRATIONS: Record<ExternalIntegrationKind, ExternalExtensionKind> = {\n intercom: 'intercom-integration',\n crispChat: 'crisp-chat-integration',\n}\n\nexport class ExternalIntegrations {\n constructor(private readonly _instance: PostHog) {}\n\n private _loadScript(name: ExternalExtensionKind, cb: () => void): void {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, name, (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n })\n }\n\n public startIfEnabledOrStop() {\n for (const [key, value] of Object.entries(this._instance.config.integrations ?? {})) {\n // if the integration is enabled, and not present, then load it\n if (value && !assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n this._loadScript(MAPPED_INTEGRATIONS[key as ExternalIntegrationKind], () => {\n assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.start(\n this._instance\n )\n })\n }\n // if the integration is disabled, and present, then stop it\n if (!value && assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.stop()\n }\n }\n }\n}\n","import Config from './config'\nimport { ConsentManager, ConsentStatus } from './consent'\nimport {\n ALIAS_ID_KEY,\n COOKIELESS_MODE_FLAG_PROPERTY,\n COOKIELESS_SENTINEL_VALUE,\n COOKIELESS_ON_REJECT,\n DEVICE_ID,\n DEVICE_MODEL,\n PERSON_PROFILES_IDENTIFIED_ONLY,\n USER_STATE_ANONYMOUS,\n USER_STATE_IDENTIFIED,\n DOM_EVENT_VISIBILITYCHANGE,\n ENABLE_PERSON_PROCESSING,\n EVENT_GROUPIDENTIFY,\n EVENT_IDENTIFY,\n EVENT_PAGELEAVE,\n EVENT_PAGEVIEW,\n FLAG_CALL_REPORTED,\n PEOPLE_DISTINCT_ID_KEY,\n PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS,\n SDK_DEBUG_EXTENSIONS_INIT_METHOD,\n SDK_DEBUG_EXTENSIONS_INIT_TIME_MS,\n SESSION_RECORDING_REMOTE_CONFIG,\n SURVEYS_REQUEST_TIMEOUT_MS,\n USER_STATE,\n COOKIELESS_ALWAYS,\n} from './constants'\nimport { DEFAULT_CONTENT_IGNORELIST_WITH_STEPPERS } from '@posthog/browser-common/utils/autocapture-utils'\nimport { isDeadClicksEnabledForAutocapture } from './extensions/dead-clicks-autocapture'\nimport { setupSegmentIntegration } from './extensions/segment-integration'\nimport { SentryIntegration, sentryIntegration, SentryIntegrationOptions } from './extensions/sentry-integration'\nimport { PageViewManager } from './page-view'\nimport { PostHogPersistence } from './posthog-persistence'\nimport {\n type DisplaySurveyOptions,\n type SurveyCallback,\n SurveyEventName,\n SurveyEventProperties,\n type SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { ProductTourEventName, ProductTourEventProperties } from './posthog-product-tours-types'\nimport { RateLimiter } from './rate-limiter'\nimport { RemoteConfigLoader } from './remote-config'\nimport { request, SUPPORTS_REQUEST } from './request'\nimport { DEFAULT_FLUSH_INTERVAL_MS, RequestQueue } from './request-queue'\nimport { RetryQueue } from './retry-queue'\nimport { ScrollManager } from './scroll-manager'\nimport { SessionPropsManager } from './session-props'\nimport { SessionIdManager } from './sessionid'\nimport { localStore } from './storage'\nimport {\n CaptureLogOptions,\n CaptureOptions,\n CaptureResult,\n Compression,\n ConfigDefaults,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureStage,\n EventName,\n ExceptionAutoCaptureConfig,\n FeatureFlagsCallback,\n FeatureFlagOptions,\n FeatureFlagResult,\n IsFeatureEnabledOptions,\n JsonType,\n OverrideConfig,\n PostHogConfig,\n Properties,\n Property,\n QueuedRequestWithOptions,\n RemoteConfigResult,\n RequestCallback,\n SessionIdChangedCallback,\n SnippetArrayItem,\n ToolbarParams,\n PostHogInterface,\n} from './types'\nimport type { TreeShakeable } from '@posthog/types'\nimport {\n _copyAndTruncateStrings,\n addEventListener,\n each,\n eachArray,\n extend,\n isCrossDomainCookie,\n migrateConfigField,\n safewrapClass,\n} from '@posthog/browser-common/utils/general-utils'\nimport { isLikelyBot } from '@posthog/browser-common/utils/blocked-uas'\nimport { getDeviceModel } from '@posthog/browser-common/utils/device-model-utils'\nimport { getEventProperties } from '@posthog/browser-common/utils/event-utils'\nimport { document, location, navigator, userAgent, window } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { getPersonPropertiesHash } from '@posthog/browser-common/utils/property-utils'\nimport { RequestRouter, RequestRouterRegion } from './utils/request-router'\nimport { SimpleEventEmitter } from '@posthog/browser-common/utils/simple-event-emitter'\nimport {\n DEFAULT_DISPLAY_SURVEY_OPTIONS,\n getSurveyInteractionProperty,\n setSurveySeenOnLocalStorage,\n} from './utils/survey-utils'\nimport {\n isEmptyString,\n isFunction,\n isKnownUnsafeEditableEvent,\n isKnownUnsafeEditableEventProperty,\n isNullish,\n isNumber,\n isString,\n isUndefined,\n includes,\n isDistinctIdStringLike,\n isArray,\n isEmptyObject,\n isObject,\n isBoolean,\n getEventUuid,\n minimizeFlagCalledEventProperties,\n} from '@posthog/core'\nimport { uuidv7 } from '@posthog/browser-common/utils/uuidv7'\nimport { ExternalIntegrations } from './extensions/external-integration'\nimport type { PostHogSurveys } from './posthog-surveys'\nimport type { Autocapture } from './autocapture'\nimport type { DeadClicksAutocapture } from './extensions/dead-clicks-autocapture'\nimport type { ExceptionObserver } from './extensions/exception-autocapture'\nimport type { HistoryAutocapture } from './extensions/history-autocapture'\nimport type { TracingHeaders } from './extensions/tracing-headers'\nimport type { WebVitalsAutocapture } from './extensions/web-vitals'\nimport type { Heatmaps } from './heatmaps'\nimport type { PostHogConversations } from './extensions/conversations/posthog-conversations'\nimport type { PostHogExceptions } from './posthog-exceptions'\nimport type { PostHogLogs } from './posthog-logs'\nimport type { PostHogMetrics } from './posthog-metrics'\nimport type { PostHogProductTours } from './posthog-product-tours'\nimport type { SiteApps } from './site-apps'\nimport type { SessionRecording } from './extensions/replay/session-recording'\nimport type { Extension } from './extensions/types'\nimport type { Toolbar } from './extensions/toolbar'\nimport type { PostHogFeatureFlags } from './posthog-featureflags'\nimport type { WebExperiments } from './web-experiments'\n\n/*\nSIMPLE STYLE GUIDE:\n\nUse TypeScript accessibility modifiers, e.g. private/protected\n\nIf something is not part of the public interface:\n* prefix it with _ to allow mangling\n* prefix it with __ to disable mangling, but signal that it is internal\n\nGlobals should be all caps\n*/\n\n/* posthog.init is called with `Partial<PostHogConfig>`\n * and we want to ensure that only valid keys are passed to the config object.\n * TypeScript does not enforce that the object passed does not have extra keys.\n * So someone can call with { bootstrap: { distinctId: '123'} }\n * which is not a valid key. They should have passed distinctID (upper case D).\n * That's a really tricky mistake to spot.\n * The OnlyValidKeys type ensures that only keys that are valid in the PostHogConfig type are allowed.\n */\ntype OnlyValidKeys<T, Shape> = T extends Shape ? (Exclude<keyof T, keyof Shape> extends never ? T : never) : never\n\nconst instances: Record<string, PostHog> = {}\n\n// Tracks re-entrant calls to _execute_array. Used to detect when a third-party\n// Proxy (e.g., TikTok's in-app browser) wraps window.posthog and converts method\n// calls into push() calls, which would otherwise cause infinite recursion.\nlet _executeArrayDepth = 0\n\nconst __NOOP = () => {}\nconst CONSENT_COOKIELESS_WARN = 'Consent opt in/out is not valid with cookieless_mode=\"always\" and will be ignored'\nconst SURVEYS_NOT_AVAILABLE = 'Surveys module not available'\nconst SANITIZE_DEPRECATED = 'sanitize_properties is deprecated. Use before_send instead'\nconst DENYLIST_INVALID = 'Invalid value for property_denylist config: '\n\n// Transport-level keys the browser SDK carries inside event properties (unlike other SDKs,\n// where they live outside `properties`). They are out of scope of the minimal\n// $feature_flag_called allowlist and must survive minimization for ingestion to work.\nconst FLAG_CALLED_TRANSPORT_PROPERTY_KEYS = ['token', 'distinct_id', COOKIELESS_MODE_FLAG_PROPERTY]\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !SUPPORTS_REQUEST && userAgent?.indexOf('MSIE') === -1 && userAgent?.indexOf('Mozilla') === -1\n\nconst defaultsThatVaryByConfig = (\n defaults?: ConfigDefaults\n): Pick<\n PostHogConfig,\n | 'rageclick'\n | 'capture_pageview'\n | 'session_recording'\n | 'external_scripts_inject_target'\n | 'internal_or_test_user_hostname'\n | 'persistence_save_debounce_ms'\n | 'split_storage'\n | 'detect_google_search_app'\n | 'disable_capture_url_hashes'\n> => ({\n rageclick:\n defaults && defaults >= '2026-05-30'\n ? { content_ignorelist: DEFAULT_CONTENT_IGNORELIST_WITH_STEPPERS, ignore_text_selection: true }\n : defaults && defaults >= '2025-11-30'\n ? { content_ignorelist: true }\n : true,\n capture_pageview: defaults && defaults >= '2025-05-24' ? 'history_change' : true,\n session_recording:\n defaults && defaults >= '2026-06-25'\n ? { strictMinimumDuration: true, canvasCapture: { resolutionScale: 0.6 }, streamNetworkBody: true }\n : defaults && defaults >= '2026-05-30'\n ? { strictMinimumDuration: true, canvasCapture: { resolutionScale: 0.6 } }\n : defaults && defaults >= '2025-11-30'\n ? { strictMinimumDuration: true }\n : {},\n external_scripts_inject_target: defaults && defaults >= '2026-01-30' ? 'head' : 'body',\n internal_or_test_user_hostname: defaults && defaults >= '2026-01-30' ? /^(localhost|127\\.0\\.0\\.1)$/ : undefined,\n persistence_save_debounce_ms: defaults && defaults >= '2026-05-30' ? 250 : 0,\n split_storage: !!(defaults && defaults >= '2026-05-30'),\n detect_google_search_app: !!(defaults && defaults >= '2026-05-30'),\n disable_capture_url_hashes: !!(defaults && defaults >= '2026-06-25'),\n})\n\n// NOTE: Remember to update `types.ts` when changing a default value\n// to guarantee documentation is up to date, make sure to also update our website docs\n// NOTE²: This shouldn't ever change because we try very hard to be backwards-compatible\nexport const defaultConfig = (defaults?: ConfigDefaults): PostHogConfig => ({\n api_host: 'https://us.i.posthog.com',\n flags_api_host: null,\n ui_host: null,\n asset_host: null,\n token: '',\n autocapture: true,\n cross_subdomain_cookie: isCrossDomainCookie(document?.location),\n persistence: 'localStorage+cookie', // up to 1.92.0 this was 'cookie'. It's easy to migrate as 'localStorage+cookie' will migrate data from cookie storage\n persistence_name: '',\n cookie_persisted_properties: [],\n loaded: __NOOP,\n save_campaign_params: true,\n custom_campaign_params: [],\n custom_blocked_useragents: [],\n save_referrer: true,\n capture_pageleave: 'if_capture_pageview', // We'll only capture pageleave events if capture_pageview is also true\n defaults: defaults ?? 'unset',\n __preview_deferred_init_extensions: false, // Opt-in only for now\n __preview_external_dependency_versioned_paths: false,\n __preview_cookie_wins_on_conflict: false, // Opt-in: fixes cross-subdomain stale-localStorage bug\n debug: (location && isString(location?.search) && location.search.indexOf('__posthog_debug=true') !== -1) || false,\n cookie_expiration: 365,\n upgrade: false,\n disable_session_recording: false,\n disable_persistence: false,\n disable_web_experiments: true, // disabled in beta.\n disable_surveys: false,\n disable_surveys_automatic_display: false,\n disable_conversations: false,\n disable_product_tours: false,\n disableDeviceModel: false,\n disable_external_dependency_loading: false,\n strict_script_versioning: false,\n enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n secure_cookie: window?.location?.protocol === 'https:',\n ip: false,\n opt_out_capturing_by_default: false,\n opt_out_persistence_by_default: false,\n opt_out_useragent_filter: false,\n opt_out_capturing_persistence_type: 'localStorage',\n consent_persistence_name: null,\n opt_out_capturing_cookie_prefix: null,\n opt_in_site_apps: false,\n property_denylist: [],\n respect_dnt: false,\n sanitize_properties: null,\n request_headers: {}, // { header: value, header2: value }\n request_batching: true,\n properties_string_max_length: 65535,\n mask_all_element_attributes: false,\n mask_all_text: false,\n mask_personal_data_properties: false,\n custom_personal_data_properties: [],\n advanced_disable_flags: false,\n advanced_disable_decide: false,\n advanced_disable_feature_flags: false,\n advanced_disable_feature_flags_on_first_load: false,\n advanced_only_evaluate_survey_feature_flags: false,\n advanced_feature_flags_dedup_per_session: false,\n advanced_enable_surveys: false,\n advanced_disable_toolbar_metrics: false,\n feature_flag_request_timeout_ms: 3000,\n surveys_request_timeout_ms: SURVEYS_REQUEST_TIMEOUT_MS,\n on_request_error: (res) => {\n const error = 'Bad HTTP status: ' + res.statusCode + ' ' + res.text\n logger.error(error)\n },\n get_device_id: (uuid) => uuid,\n capture_performance: undefined,\n name: 'posthog',\n bootstrap: {},\n disable_compression: false,\n session_idle_timeout_seconds: 30 * 60, // 30 minutes\n person_profiles: PERSON_PROFILES_IDENTIFIED_ONLY,\n before_send: undefined,\n get_current_url: undefined,\n request_queue_config: { flush_interval_ms: DEFAULT_FLUSH_INTERVAL_MS },\n error_tracking: {},\n\n // Used for internal testing\n _onCapture: __NOOP,\n\n ...defaultsThatVaryByConfig(defaults),\n})\n\nconst CONFIG_RENAMES: [keyof PostHogConfig, keyof PostHogConfig][] = [\n ['process_person', 'person_profiles'],\n ['xhr_headers', 'request_headers'],\n ['cookie_name', 'persistence_name'],\n ['disable_cookie', 'disable_persistence'],\n ['__preview_disable_beacon', 'disable_beacon'],\n ['store_google', 'save_campaign_params'],\n ['verbose', 'debug'],\n]\n\nexport const configRenames = (origConfig: Partial<PostHogConfig>): Partial<PostHogConfig> => {\n const renames: Partial<PostHogConfig> = {}\n for (const [oldKey, newKey] of CONFIG_RENAMES) {\n if (!isUndefined((origConfig as any)[oldKey])) {\n ;(renames as any)[newKey] = (origConfig as any)[oldKey]\n }\n }\n // on_xhr_error is not present, as the type is different to on_request_error\n\n // the original config takes priority over the renames\n const newConfig = extend({}, renames, origConfig)\n\n // Maintain backwards compatibility for the deprecated preview option while\n // letting the supported options take precedence when they are provided.\n const previewExternalDependencyVersionedPaths = origConfig.__preview_external_dependency_versioned_paths\n if (!isUndefined(previewExternalDependencyVersionedPaths)) {\n if (isUndefined(origConfig.strict_script_versioning)) {\n newConfig.strict_script_versioning = !!previewExternalDependencyVersionedPaths\n }\n if (isString(previewExternalDependencyVersionedPaths) && isUndefined(origConfig.asset_host)) {\n newConfig.asset_host = previewExternalDependencyVersionedPaths\n }\n }\n\n // merge property_blacklist into property_denylist\n if (isArray(origConfig.property_blacklist)) {\n if (isUndefined(origConfig.property_denylist)) {\n newConfig.property_denylist = origConfig.property_blacklist\n } else if (isArray(origConfig.property_denylist)) {\n newConfig.property_denylist = [...origConfig.property_blacklist, ...origConfig.property_denylist]\n } else {\n logger.error(DENYLIST_INVALID + origConfig.property_denylist)\n }\n }\n\n return newConfig\n}\n\nclass DeprecatedWebPerformanceObserver {\n get _forceAllowLocalhost(): boolean {\n return this.__forceAllowLocalhost\n }\n\n set _forceAllowLocalhost(value: boolean) {\n logger.error(\n 'WebPerformanceObserver is deprecated and has no impact on network capture. Use `_forceAllowLocalhostNetworkCapture` on `posthog.sessionRecording`'\n )\n this.__forceAllowLocalhost = value\n }\n\n private __forceAllowLocalhost: boolean = false\n}\n\n/**\n *\n * This is the SDK reference for the PostHog JavaScript Web SDK.\n * You can learn more about example usage in the\n * [JavaScript Web SDK documentation](/docs/libraries/js).\n * You can also follow [framework specific guides](/docs/frameworks)\n * to integrate PostHog into your project.\n *\n * This SDK is designed for browser environments.\n * Use the PostHog [Node.js SDK](/docs/libraries/node) for server-side usage.\n *\n * @constructor\n */\nexport class PostHog implements PostHogInterface {\n static __defaultExtensionClasses: PostHogConfig['__extensionClasses'] = {}\n\n __loaded: boolean\n config: PostHogConfig\n _originalUserConfig?: Partial<PostHogConfig>\n\n rateLimiter: RateLimiter\n scrollManager: ScrollManager\n pageViewManager: PageViewManager\n featureFlags: TreeShakeable<PostHogFeatureFlags>\n surveys: TreeShakeable<PostHogSurveys>\n conversations: TreeShakeable<PostHogConversations>\n logs: TreeShakeable<PostHogLogs>\n metrics: TreeShakeable<PostHogMetrics>\n experiments: TreeShakeable<WebExperiments>\n toolbar: TreeShakeable<Toolbar>\n exceptions: TreeShakeable<PostHogExceptions>\n consent: ConsentManager\n\n // These are instance-specific state created after initialisation\n persistence?: PostHogPersistence\n sessionPersistence?: PostHogPersistence\n sessionManager?: SessionIdManager\n sessionPropsManager?: SessionPropsManager\n requestRouter: RequestRouter\n siteApps?: SiteApps\n autocapture?: Autocapture\n heatmaps?: Heatmaps\n tracingHeaders?: TracingHeaders\n webVitalsAutocapture?: WebVitalsAutocapture\n exceptionObserver?: ExceptionObserver\n deadClicksAutocapture?: DeadClicksAutocapture\n historyAutocapture?: HistoryAutocapture\n productTours?: PostHogProductTours\n\n _requestQueue?: RequestQueue\n _retryQueue?: RetryQueue\n sessionRecording?: SessionRecording\n externalIntegrations?: ExternalIntegrations\n webPerformance = new DeprecatedWebPerformanceObserver()\n\n _initialPageviewCaptured: boolean\n _visibilityStateListener: (() => void) | null\n _personProcessingSetOncePropertiesSent: boolean = false\n _triggered_notifs: any\n compression?: Compression\n __request_queue: QueuedRequestWithOptions[]\n _pendingRemoteConfig?: RemoteConfigResult\n _lastRemoteConfig?: RemoteConfigResult\n _remoteConfigLoader?: RemoteConfigLoader\n analyticsDefaultEndpoint: string\n version: string = Config.LIB_VERSION\n _initialPersonProfilesConfig: 'always' | 'never' | 'identified_only' | null\n _cachedPersonProperties: string | null\n\n SentryIntegration: typeof SentryIntegration\n sentryIntegration: (options?: SentryIntegrationOptions) => ReturnType<typeof sentryIntegration>\n\n _internalEventEmitter = new SimpleEventEmitter()\n\n private readonly _extensions: Extension[] = []\n\n private _replaceExtension<T extends Extension>(oldExt: T | undefined, newExt: T): T {\n if (oldExt) {\n const idx = this._extensions.indexOf(oldExt)\n if (idx !== -1) {\n this._extensions.splice(idx, 1)\n }\n }\n this._extensions.push(newExt)\n newExt.initialize?.()\n return newExt\n }\n\n private _inCookielessMode(): boolean {\n return (\n this.config.cookieless_mode === COOKIELESS_ALWAYS ||\n (this.config.cookieless_mode === COOKIELESS_ON_REJECT && this.consent.isRejected())\n )\n }\n\n // Legacy property to support existing usage - this isn't technically correct but it's what it has always been - a proxy for flags being loaded\n /** @deprecated Use `flagsEndpointWasHit` instead. We migrated to using a new feature flag endpoint and the new method is more semantically accurate */\n public get decideEndpointWasHit(): boolean {\n return this.featureFlags?.hasLoadedFlags ?? false\n }\n\n /**\n * Whether feature flags have been initialized for this instance.\n *\n * @remarks\n * Despite the name, this is a proxy for processed feature flag values. It may be true for\n * bootstrapped flags before a network request completes.\n *\n * @returns True once the SDK has processed feature flag values.\n */\n public get flagsEndpointWasHit(): boolean {\n return this.featureFlags?.hasLoadedFlags ?? false\n }\n\n /** DEPRECATED: We keep this to support existing usage but now one should just call .setPersonProperties */\n people: {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n }\n\n /**\n * Creates an uninitialized PostHog instance.\n *\n * @remarks\n * Most browser applications should use the default exported singleton and call `posthog.init()`.\n * Construct a new instance only when you need to manage a separate SDK instance manually.\n *\n * @example\n * ```js\n * const instance = new PostHog()\n * instance.init('<ph_project_api_key>', { api_host: 'https://us.i.posthog.com' })\n * ```\n */\n constructor() {\n this.config = defaultConfig()\n\n this.SentryIntegration = SentryIntegration\n this.sentryIntegration = (options?: SentryIntegrationOptions) => sentryIntegration(this, options)\n this.__request_queue = []\n this.__loaded = false\n this.analyticsDefaultEndpoint = '/e/'\n this._initialPageviewCaptured = false\n this._visibilityStateListener = null\n this._initialPersonProfilesConfig = null\n this._cachedPersonProperties = null\n this.scrollManager = new ScrollManager(this)\n this.pageViewManager = new PageViewManager(this)\n this.rateLimiter = new RateLimiter(this)\n this.requestRouter = new RequestRouter(this)\n this.consent = new ConsentManager(this)\n this.externalIntegrations = new ExternalIntegrations(this)\n\n // Eagerly construct extensions from default classes so they're available before init().\n // For the slim bundle, these remain undefined until _initExtensions sets them from config.\n const ext = PostHog.__defaultExtensionClasses ?? {}\n this.featureFlags = ext.featureFlags && new ext.featureFlags(this)\n this.toolbar = ext.toolbar && new ext.toolbar(this)\n this.surveys = ext.surveys && new ext.surveys(this)\n this.conversations = ext.conversations && new ext.conversations(this)\n this.logs = ext.logs && new ext.logs(this)\n this.metrics = ext.metrics && new ext.metrics(this)\n this.experiments = ext.experiments && new ext.experiments(this)\n this.exceptions = ext.exceptions && new ext.exceptions(this)\n\n // NOTE: See the property definition for deprecation notice\n this.people = {\n set: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = isString(prop) ? { [prop]: to } : prop\n this.setPersonProperties(setProps)\n callback?.({} as any)\n },\n set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n const setProps = isString(prop) ? { [prop]: to } : prop\n this.setPersonProperties(undefined, setProps)\n callback?.({} as any)\n },\n }\n\n this.on('eventCaptured', (data) => logger.info(`send \"${data?.event}\"`, data))\n }\n\n // Initialization methods\n\n /**\n * Initializes a new instance of the PostHog capturing object.\n *\n * @remarks\n * All new instances are added to the main posthog object as sub properties (such as\n * `posthog.library_name`) and also returned by this function. [Learn more about configuration options](https://posthog.com/docs/libraries/js/config)\n *\n * @example\n * ```js\n * // basic initialization\n * posthog.init('<ph_project_api_key>', {\n * api_host: '<ph_client_api_host>'\n * })\n * ```\n *\n * @example\n * ```js\n * // multiple instances\n * posthog.init('<ph_project_api_key>', {}, 'project1')\n * posthog.init('<ph_project_api_key>', {}, 'project2')\n * ```\n *\n * @public\n *\n * @param token - Your PostHog API token\n * @param config - A dictionary of config options to override\n * @param name - The name for the new posthog instance that you want created\n *\n * {@label Initialization}\n *\n * @returns The newly initialized PostHog instance\n */\n init(\n token: string,\n config?: OnlyValidKeys<Partial<PostHogConfig>, Partial<PostHogConfig>>,\n name?: string\n ): PostHog {\n if (!name || name === PRIMARY_INSTANCE_NAME) {\n // This means we are initializing the primary instance (i.e. this)\n return this._init(token, config, name)\n } else {\n const namedPosthog = instances[name] ?? new PostHog()\n namedPosthog._init(token, config, name)\n instances[name] = namedPosthog\n\n // Add as a property to the primary instance (this isn't type-safe but it is how it was always done)\n ;(instances[PRIMARY_INSTANCE_NAME] as any)[name] = namedPosthog\n\n return namedPosthog\n }\n }\n\n // posthog._init(token:string, config:object, name:string)\n //\n // This function sets up the current instance of the posthog\n // library. The difference between this method and the init(...)\n // method is this one initializes the actual instance, whereas the\n // init(...) method sets up a new library and calls _init on it.\n //\n // Note that there are operations that can be asynchronous, so we\n // accept a callback that is called when all the asynchronous work\n // is done. Note that we do not use promises because we want to be\n // IE11 compatible. We could use polyfills, which would make the\n // code a bit cleaner, but will add some overhead.\n //\n _init(token: string, config: Partial<PostHogConfig> = {}, name?: string): PostHog {\n const normalizedToken = isString(token) ? token.trim() : ''\n if (!normalizedToken) {\n logger.critical(\n 'PostHog was initialized without a token. This likely indicates a misconfiguration. Please check the first argument passed to posthog.init()'\n )\n return this\n }\n\n if (this.__loaded) {\n // need to be able to log before having processed debug config\n // eslint-disable-next-line no-console\n console.warn('[PostHog.js]', 'You have already initialized PostHog! Re-initializing is a no-op')\n return this\n }\n\n this.__loaded = true\n this.config = defaultConfig(config.defaults) // fully overwritten by set_config right below\n config.debug = this._checkLocalStorageForDebug(config.debug)\n this._originalUserConfig = config // Store original user config for migration\n\n this._triggered_notifs = []\n\n if (config.person_profiles) {\n this._initialPersonProfilesConfig = config.person_profiles\n } else if (config.process_person) {\n this._initialPersonProfilesConfig = config.process_person\n }\n\n const baseConfig = defaultConfig(config.defaults)\n const userConfig = configRenames(config)\n const mergedConfig = extend({}, baseConfig, userConfig, {\n name: name,\n token: normalizedToken,\n })\n // a partial user-supplied rageclick object should keep the date-gated defaults\n // (e.g. content_ignorelist, ignore_text_selection) rather than replacing them wholesale\n if (isObject(baseConfig.rageclick) && isObject(userConfig.rageclick)) {\n mergedConfig.rageclick = extend({}, baseConfig.rageclick, userConfig.rageclick)\n }\n // likewise a partial user-supplied session_recording keeps the date-gated top-level\n // defaults (e.g. strictMinimumDuration, canvasCapture) it doesn't set. this is a shallow\n // one-level merge: a user-supplied nested object (e.g. their own canvasCapture) still\n // replaces the default one wholesale rather than merging into it.\n if (isObject(baseConfig.session_recording) && isObject(userConfig.session_recording)) {\n mergedConfig.session_recording = extend({}, baseConfig.session_recording, userConfig.session_recording)\n }\n this.set_config(mergedConfig)\n\n if (this.config.on_xhr_error) {\n logger.error('on_xhr_error is deprecated. Use on_request_error instead')\n }\n\n this.compression = config.disable_compression ? undefined : Compression.GZipJS\n\n const persistenceDisabled = this._is_persistence_disabled()\n\n this.persistence = new PostHogPersistence(this.config, persistenceDisabled)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n ? this.persistence\n : // sessionStorage sibling shares the primary's storage name; it must not own/clean the split group entries\n new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' }, persistenceDisabled, false)\n\n // should I store the initial person profiles config in persistence?\n const initialPersistenceProps = { ...this.persistence.props }\n const initialSessionProps = { ...this.sessionPersistence.props }\n\n this.register({ $initialization_time: new Date().toISOString() })\n\n this._requestQueue = new RequestQueue(\n (req) => this._send_retriable_request(req),\n this.config.request_queue_config\n )\n this._retryQueue = new RetryQueue(this)\n this.__request_queue = []\n\n const startInCookielessMode = this._inCookielessMode()\n\n if (!startInCookielessMode) {\n this.sessionManager = new SessionIdManager(this)\n this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n }\n\n // Conditionally defer extension initialization based on config\n if (this.config.__preview_deferred_init_extensions) {\n // EXPERIMENTAL: Defer non-critical extension initialization to next tick\n // This reduces main thread blocking during init\n // while keeping critical path (persistence, sessions, capture) synchronous\n logger.info('Deferring extension initialization to improve startup performance')\n setTimeout(() => {\n this._initExtensions(startInCookielessMode)\n }, 0)\n } else {\n // Legacy synchronous initialization (default for now)\n logger.info('Initializing extensions synchronously')\n this._initExtensions(startInCookielessMode)\n }\n\n // if any instance on the page has debug = true, we set the\n // global debug to be true\n Config.DEBUG = Config.DEBUG || this.config.debug\n if (Config.DEBUG) {\n logger.info('Starting in debug mode', {\n this: this,\n config,\n thisC: { ...this.config },\n p: initialPersistenceProps,\n s: initialSessionProps,\n })\n }\n\n // When identity_distinct_id is provided at init time, use it as the\n // bootstrap distinct ID so the Person record is created from the first event.\n if (this.config.identity_distinct_id && !config.bootstrap?.distinctID) {\n config.bootstrap = {\n ...config.bootstrap,\n distinctID: this.config.identity_distinct_id,\n isIdentifiedID: true,\n }\n }\n\n // isUndefined doesn't provide typehint here so wouldn't reduce bundle as we'd need to assign\n // eslint-disable-next-line posthog-js/no-direct-undefined-check\n if (config.bootstrap?.distinctID !== undefined) {\n const bootstrapDistinctId = config.bootstrap.distinctID\n const existingDistinctId = this.get_distinct_id()\n const existingUserState = this.persistence.get_property(USER_STATE)\n\n if (\n config.bootstrap.isIdentifiedID &&\n existingDistinctId != null &&\n existingDistinctId !== bootstrapDistinctId &&\n existingUserState === USER_STATE_ANONYMOUS\n ) {\n // The server bootstrapped identity for an identified user, but local persistence\n // still has an anonymous ID from a previous session. Calling identify() merges\n // the anonymous user into the identified user, ensuring consistent identity\n // for feature flag evaluation and preventing duplicate $feature_flag_called events.\n //\n // Note: this runs during _init(), before _loaded() enables the request queue.\n // The $identify event is enqueued and flushed once the queue starts. The\n // reloadFeatureFlags() call inside identify() sets _reloadDebouncer, so the\n // subsequent ensureFlagsLoaded() from _onRemoteConfig is a no-op (no double request).\n this.identify(bootstrapDistinctId)\n } else if (\n config.bootstrap.isIdentifiedID &&\n existingDistinctId != null &&\n existingDistinctId !== bootstrapDistinctId &&\n existingUserState === USER_STATE_IDENTIFIED\n ) {\n // The existing user is already identified with a different ID. Silently\n // switching identities without an $identify event would corrupt analytics.\n // Preserve the existing identity and log a warning.\n logger.warn(\n 'Bootstrap distinctID differs from an already-identified user. ' +\n 'The existing identity is preserved. Call reset() before reinitializing ' +\n 'if you intend to switch users.'\n )\n } else {\n const uuid = this.config.get_device_id(uuidv7())\n const deviceID = config.bootstrap.isIdentifiedID ? uuid : bootstrapDistinctId\n this.persistence.set_property(\n USER_STATE,\n config.bootstrap.isIdentifiedID ? USER_STATE_IDENTIFIED : USER_STATE_ANONYMOUS\n )\n this.register({\n distinct_id: bootstrapDistinctId,\n $device_id: deviceID,\n })\n }\n }\n\n if (startInCookielessMode) {\n this.register_once(\n {\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n },\n ''\n )\n } else if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persistence\n const uuid = this.config.get_device_id(uuidv7())\n\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: uuid,\n },\n ''\n )\n // distinct id == $device_id is a proxy for anonymous user\n this.persistence.set_property(USER_STATE, USER_STATE_ANONYMOUS)\n }\n // Set up event handler for pageleave\n // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n //\n // Not making it passive to try and force the browser to handle this before the page is unloaded\n addEventListener(window, 'onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this), {\n passive: false,\n })\n\n // We want to avoid promises for IE11 compatibility, so we use callbacks here\n if (config.segment) {\n setupSegmentIntegration(this, () => this._loaded())\n } else {\n this._loaded()\n }\n\n if (isFunction(this.config._onCapture) && this.config._onCapture !== __NOOP) {\n logger.warn('onCapture is deprecated. Please use `before_send` instead')\n this.on('eventCaptured', (data) => this.config._onCapture(data.event, data))\n }\n\n if (this.config.ip) {\n logger.warn(\n 'The `ip` config option has NO EFFECT AT ALL and has been deprecated. Use a custom transformation or \"Discard IP data\" project setting instead. See https://posthog.com/tutorials/web-redact-properties#hiding-customer-ip-address for more information.'\n )\n }\n\n // Not awaited — the first event may miss $device_model, which is fine for a stable per-device dimension.\n if (!this.config.disableDeviceModel) {\n getDeviceModel()\n .then((model) => {\n if (model) {\n this.register({ [DEVICE_MODEL]: model })\n }\n })\n .catch(__NOOP)\n }\n\n return this\n }\n\n private _initExtensions(startInCookielessMode: boolean): void {\n // we don't support IE11 anymore, so performance.now is safe\n // eslint-disable-next-line compat/compat\n const initStartTime = performance.now()\n const ext = { ...PostHog.__defaultExtensionClasses, ...this.config.__extensionClasses }\n const initTasks: Array<() => void> = []\n\n // Due to name mangling, we can't easily iterate and assign these extensions\n // The assignment needs to also be mangled. Thus, the loop is unrolled.\n if (ext.featureFlags) {\n this._extensions.push((this.featureFlags = this.featureFlags ?? new ext.featureFlags(this)))\n }\n if (ext.exceptions) {\n this._extensions.push((this.exceptions = this.exceptions ?? new ext.exceptions(this)))\n }\n if (ext.historyAutocapture) {\n this._extensions.push((this.historyAutocapture = new ext.historyAutocapture(this)))\n }\n if (ext.tracingHeaders) {\n this._extensions.push((this.tracingHeaders = new ext.tracingHeaders(this)))\n }\n if (ext.siteApps) {\n this._extensions.push((this.siteApps = new ext.siteApps(this)))\n }\n if (ext.sessionRecording && !startInCookielessMode) {\n this._extensions.push((this.sessionRecording = new ext.sessionRecording(this)))\n }\n if (!this.config.disable_scroll_properties) {\n initTasks.push(() => {\n this.scrollManager.startMeasuringScrollPosition()\n })\n }\n if (ext.autocapture) {\n this._extensions.push((this.autocapture = new ext.autocapture(this)))\n }\n if (ext.surveys) {\n this._extensions.push((this.surveys = this.surveys ?? new ext.surveys(this)))\n }\n if (ext.logs) {\n this._extensions.push((this.logs = this.logs ?? new ext.logs(this)))\n }\n if (ext.metrics) {\n this._extensions.push((this.metrics = this.metrics ?? new ext.metrics(this)))\n }\n if (ext.conversations) {\n this._extensions.push((this.conversations = this.conversations ?? new ext.conversations(this)))\n }\n if (ext.productTours) {\n this._extensions.push((this.productTours = new ext.productTours(this)))\n }\n if (ext.heatmaps) {\n this._extensions.push((this.heatmaps = new ext.heatmaps(this)))\n }\n if (ext.webVitalsAutocapture) {\n this._extensions.push((this.webVitalsAutocapture = new ext.webVitalsAutocapture(this)))\n }\n if (ext.exceptionObserver) {\n this._extensions.push((this.exceptionObserver = new ext.exceptionObserver(this)))\n }\n if (ext.deadClicksAutocapture) {\n this._extensions.push(\n (this.deadClicksAutocapture = new ext.deadClicksAutocapture(this, isDeadClicksEnabledForAutocapture))\n )\n }\n if (ext.toolbar) {\n this._extensions.push((this.toolbar = this.toolbar ?? new ext.toolbar(this)))\n }\n if (ext.experiments) {\n this._extensions.push((this.experiments = this.experiments ?? new ext.experiments(this)))\n }\n\n this._extensions.forEach((extension) => {\n if (!extension.initialize) return\n initTasks.push(() => {\n extension.initialize?.()\n })\n })\n\n // Replay any pending remote config that arrived before extensions were ready\n initTasks.push(() => {\n if (this._pendingRemoteConfig) {\n const result = this._pendingRemoteConfig\n this._pendingRemoteConfig = undefined // Clear before replaying to avoid re-storing\n this._onRemoteConfig(result)\n }\n })\n\n // Process tasks with time-slicing to avoid blocking\n this._processInitTaskQueue(initTasks, initStartTime)\n }\n\n private _processInitTaskQueue(queue: Array<() => void>, initStartTime: number): void {\n const TIME_BUDGET_MS = 30 // Respect frame budget (~60fps = 16ms, but we're already deferred)\n\n while (queue.length > 0) {\n // Only time-slice if deferred init is enabled, otherwise run synchronously\n if (this.config.__preview_deferred_init_extensions) {\n // we don't support IE11 anymore, so performance.now is safe\n const elapsed = performance.now() - initStartTime\n\n // Check if we've exceeded our time budget\n if (elapsed >= TIME_BUDGET_MS && queue.length > 0) {\n // Yield to browser, then continue processing\n setTimeout(() => {\n this._processInitTaskQueue(queue, initStartTime)\n }, 0)\n return\n }\n }\n\n // Process next task\n const task = queue.shift()\n if (task) {\n try {\n task()\n } catch (error) {\n logger.error('Error initializing extension:', error)\n }\n }\n }\n\n // All tasks complete - record timing for both sync and deferred modes\n // we don't support IE11 anymore, so performance.now is safe\n // eslint-disable-next-line compat/compat\n const taskInitTiming = Math.round(performance.now() - initStartTime)\n this.register_for_session({\n [SDK_DEBUG_EXTENSIONS_INIT_METHOD]: this.config.__preview_deferred_init_extensions\n ? 'deferred'\n : 'synchronous',\n [SDK_DEBUG_EXTENSIONS_INIT_TIME_MS]: taskInitTiming,\n })\n if (this.config.__preview_deferred_init_extensions) {\n logger.info(`PostHog extensions initialized (${taskInitTiming}ms)`)\n }\n }\n\n _onRemoteConfig(result: RemoteConfigResult) {\n if (!(document && document.body)) {\n logger.info('document not ready yet, trying again in 500 milliseconds...')\n setTimeout(() => {\n this._onRemoteConfig(result)\n }, 500)\n return\n }\n\n // Store config in case extensions aren't initialized yet (only needed for deferred init)\n if (this.config.__preview_deferred_init_extensions) {\n this._pendingRemoteConfig = result\n }\n\n // Cache the latest remote config result so extensions that are created later\n // (e.g. sessionRecording after opt_in_capturing from cookieless mode) can\n // replay it and pick up server-side settings like recording enable flags.\n // Storing the result (not just a config) means a replayed failure is\n // distinguishable from a successful empty config.\n this._lastRemoteConfig = result\n\n this.compression = undefined\n if (result.ok) {\n const config = result.config\n if (config.supportedCompression && !this.config.disable_compression) {\n this.compression = includes(config['supportedCompression'], Compression.GZipJS)\n ? Compression.GZipJS\n : includes(config['supportedCompression'], Compression.Base64)\n ? Compression.Base64\n : undefined\n }\n\n if (config.analytics?.endpoint) {\n this.analyticsDefaultEndpoint = config.analytics.endpoint\n }\n }\n\n // Runs on failure too: the person_profiles default must be applied even when\n // the remote config could not be fetched.\n this.set_config({\n person_profiles: this._initialPersonProfilesConfig\n ? this._initialPersonProfilesConfig\n : PERSON_PROFILES_IDENTIFIED_ONLY,\n })\n\n // Every extension receives the full result and handles the failure case itself.\n this._extensions.forEach((ext) => ext.onRemoteConfig?.(result))\n }\n\n _loaded(): void {\n try {\n this.config.loaded(this)\n } catch (err) {\n logger.critical('`loaded` function failed', err)\n }\n\n this._start_queue_if_opted_in()\n\n // Check if current hostname matches internal_or_test_user_hostname pattern and mark as test user before any events\n if (this.config.internal_or_test_user_hostname && location?.hostname) {\n const hostname = location.hostname\n const pattern = this.config.internal_or_test_user_hostname\n const matches = typeof pattern === 'string' ? hostname === pattern : pattern.test(hostname)\n if (matches) {\n this.setInternalOrTestUser()\n }\n }\n\n // this happens after \"loaded\" so a user can call identify or any other things before the pageview fires\n if (this.config.capture_pageview) {\n // NOTE: We want to fire this on the next tick as the previous implementation had this side effect\n // and some clients may rely on it\n setTimeout(() => {\n if (this.consent.isOptedIn() || this._inCookielessMode()) {\n this._captureInitialPageview()\n }\n }, 1)\n }\n\n this._remoteConfigLoader = new RemoteConfigLoader(this)\n this._remoteConfigLoader.load()\n }\n\n _start_queue_if_opted_in(): void {\n if (this.is_capturing()) {\n if (this.config.request_batching) {\n this._requestQueue?.enable()\n }\n }\n }\n\n _dom_loaded(): void {\n if (this.is_capturing()) {\n eachArray(this.__request_queue, (item) => this._send_retriable_request(item))\n }\n\n this.__request_queue = []\n this._start_queue_if_opted_in()\n }\n\n _handle_unload(): void {\n // Optional-call the method, not just the receiver: after a deploy a cached older\n // lazy-loaded surveys chunk can yield an instance whose prototype lacks handlePageUnload,\n // and `this.surveys?.handlePageUnload()` would still throw \"handlePageUnload is not a function\".\n this.surveys?.handlePageUnload?.()\n\n // Metrics are pre-aggregated client-side and don't ride the request\n // queue, so the drain must not depend on `request_batching`.\n void this.metrics?.flush('sendBeacon')\n\n if (!this.config.request_batching) {\n if (this._shouldCapturePageleave()) {\n this.capture(EVENT_PAGELEAVE, null, { transport: 'sendBeacon' })\n }\n return\n }\n\n if (this._shouldCapturePageleave()) {\n this.capture(EVENT_PAGELEAVE)\n }\n\n this.logs?.flushLogs('sendBeacon')\n this._requestQueue?.unload()\n this._retryQueue?.unload()\n }\n\n _send_request(options: QueuedRequestWithOptions): void {\n if (!this.__loaded) {\n if (options.fireCallbackOnDrop) {\n options.callback?.({ statusCode: 0 })\n }\n return\n }\n\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push(options)\n return\n }\n\n if (this.rateLimiter.isServerRateLimited(options.batchKey)) {\n if (options.fireCallbackOnDrop) {\n options.callback?.({ statusCode: 429 })\n }\n return\n }\n\n options.transport = options.transport || this.config.api_transport\n options.headers = {\n ...this.config.request_headers,\n ...options.headers,\n }\n options.compression = options.compression === 'best-available' ? this.compression : options.compression\n const disableBeacon = isUndefined(this.config.disable_beacon)\n ? this.config.__preview_disable_beacon\n : this.config.disable_beacon\n if (disableBeacon) {\n options.disableTransport = ['sendBeacon']\n }\n\n // Specially useful if you're doing SSR with NextJS\n // Users must be careful when tweaking `cache` because they might get out-of-date feature flags\n options.fetchOptions = options.fetchOptions || this.config.fetch_options\n\n request({\n ...options,\n callback: (response) => {\n this.rateLimiter.checkForLimiting(response)\n\n if (response.statusCode >= 400) {\n this.config.on_request_error?.(response)\n }\n\n options.callback?.(response)\n },\n })\n }\n\n _send_retriable_request(options: QueuedRequestWithOptions): void {\n if (this._retryQueue) {\n this._retryQueue.retriableRequest(options)\n } else {\n this._send_request(options)\n }\n }\n\n /**\n * _execute_array() deals with processing any posthog function\n * calls that were called before the PostHog library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the posthog function calls && user defined\n * functions BEFORE we fire off posthog capturing calls. This is so\n * identify/register/set_config calls can properly modify early\n * capturing calls.\n *\n * @param {Array} array\n */\n _execute_array(array: SnippetArrayItem[]): void {\n _executeArrayDepth++\n try {\n let fn_name\n const alias_calls: SnippetArrayItem[] = []\n const other_calls: SnippetArrayItem[] = []\n const capturing_calls: SnippetArrayItem[] = []\n eachArray(array, (item) => {\n if (item) {\n fn_name = item[0]\n if (isArray(fn_name)) {\n capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n } else if (isFunction(item)) {\n try {\n ;(item as any).call(this)\n } catch (e) {\n logger.error('Error executing queued PostHog call', item, e)\n }\n } else if (isArray(item) && fn_name === 'alias') {\n alias_calls.push(item)\n } else if (\n isArray(item) &&\n fn_name.indexOf('capture') !== -1 &&\n isFunction((this as any)[fn_name])\n ) {\n capturing_calls.push(item)\n } else {\n other_calls.push(item)\n }\n }\n })\n\n const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n eachArray(calls, function (item) {\n try {\n if (isArray(item[0])) {\n // chained call\n let caller = thisArg\n each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1))\n })\n } else {\n thisArg[item[0]].apply(thisArg, item.slice(1))\n }\n } catch (e) {\n logger.error('Error executing queued PostHog call', item, e)\n }\n })\n }\n\n execute(alias_calls, this)\n execute(other_calls, this)\n execute(capturing_calls, this)\n } finally {\n _executeArrayDepth--\n }\n }\n\n /**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * @example\n * ```js\n * posthog.push(['register', { a: 'b' }]);\n * ```\n *\n * @param {SnippetArrayItem} item A `[function_name, ...args]` array to be executed.\n */\n push(item: SnippetArrayItem): void {\n if (_executeArrayDepth > 0 && isArray(item) && isString(item[0])) {\n // push() is being called while _execute_array is already running.\n // This happens when a third-party Proxy (e.g., TikTok's in-app browser)\n // wraps window.posthog and converts method calls into push() calls,\n // creating an infinite loop: _execute_array -> this[method] -> Proxy ->\n // push -> _execute_array -> ...\n // Dispatch directly from the prototype to break the cycle.\n const fn = (PostHog.prototype as any)[item[0]]\n if (isFunction(fn)) {\n fn.apply(this, item.slice(1))\n }\n return\n }\n this._execute_array([item])\n }\n\n /**\n * Captures an event with optional properties and configuration.\n *\n * @remarks\n * You can capture arbitrary object-like values as events. [Learn about capture best practices](/docs/product-analytics/capture-events)\n *\n * @example\n * ```js\n * // basic event capture\n * posthog.capture('cta-button-clicked', {\n * button_name: 'Get Started',\n * page: 'homepage'\n * })\n * ```\n *\n * {@label Capture}\n *\n * @public\n *\n * @param event_name - The name of the event (e.g., 'Sign Up', 'Button Click', 'Purchase')\n * @param properties - Properties to include with the event describing the user or event details\n * @param options - Optional configuration for the capture request\n *\n * @returns The capture result containing event data, or undefined if capture failed\n */\n capture(\n event_name: EventName,\n properties?: Properties | null,\n options?: CaptureOptions\n ): CaptureResult | undefined {\n // While developing, a developer might purposefully _not_ call init(),\n // in this case, we would like capture to be a noop.\n if (!this.__loaded || !this.persistence || !this.sessionPersistence || !this._requestQueue) {\n logger.uninitializedWarning('posthog.capture')\n return\n }\n\n if (!this.is_capturing()) {\n return\n }\n\n // typing doesn't prevent interesting data\n if (isUndefined(event_name) || !isString(event_name)) {\n logger.error('No event name provided to posthog.capture')\n return\n }\n\n const isBot = !this.config.opt_out_useragent_filter && this._is_bot()\n const shouldDropBotEvent = isBot && !this.config.__preview_capture_bot_pageviews\n\n // We drop bot events unless the preview flag to send bot pageviews is enabled\n // or the user has explicitly opted out of useragent filtering\n if (shouldDropBotEvent) {\n return\n }\n\n const clientRateLimitContext = !options?.skip_client_rate_limiting\n ? this.rateLimiter.clientRateLimitContext()\n : undefined\n\n if (clientRateLimitContext?.isRateLimited) {\n logger.critical('This capture call is ignored due to client rate limiting.')\n return\n }\n\n if (properties?.$current_url && !isString(properties?.$current_url)) {\n logger.error(\n 'Invalid `$current_url` property provided to `posthog.capture`. Input must be a string. Ignoring provided value.'\n )\n delete properties?.$current_url\n }\n\n if (event_name === '$exception' && !options?._originatedFromCaptureException) {\n logger.warn(\n \"Using `posthog.capture('$exception')` is unreliable because it does not attach required metadata. Use `posthog.captureException(error)` instead, which attaches required metadata automatically.\"\n )\n }\n\n // update persistence\n this.sessionPersistence.update_search_keyword()\n\n // The initial campaign/referrer props need to be stored in the regular persistence, as they are there to mimic\n // the person-initial props. The non-initial versions are stored in the sessionPersistence, as they are sent\n // with every event and used by the session table to create session-initial props.\n if (this.config.save_campaign_params) {\n this.sessionPersistence.update_campaign_params()\n }\n if (this.config.save_referrer) {\n this.sessionPersistence.update_referrer_info()\n }\n\n if (this.config.save_campaign_params || this.config.save_referrer) {\n this.persistence.set_initial_person_info()\n }\n\n const systemTime = new Date()\n const timestamp = options?.timestamp || systemTime\n\n // codeql[js/insecure-randomness] Event UUIDs are identifiers for deduplication, not secrets.\n const uuid = getEventUuid(options?.uuid, uuidv7)\n let data: CaptureResult = {\n uuid,\n event: event_name,\n properties: this.calculateEventProperties(event_name, properties || {}, timestamp, uuid),\n }\n\n // Route pageviews to $bot_pageview when bot detected and preview flag enabled\n if (event_name === EVENT_PAGEVIEW && this.config.__preview_capture_bot_pageviews && isBot) {\n data.event = '$bot_pageview'\n // While it's obvious that a $bot_pageview is (likely) from a bot, we explicitly set $browser_type\n // to make it easy to filter and test bot pageviews in the product\n data.properties.$browser_type = 'bot'\n }\n\n if (clientRateLimitContext) {\n data.properties['$lib_rate_limit_remaining_tokens'] = clientRateLimitContext.remainingTokens\n }\n\n // When the server gates this project into minimal $feature_flag_called events and the\n // evaluated flag is not linked to an experiment, the fully merged properties are rebuilt\n // from the strict allowlist below (after the last SDK-added property) so super properties\n // and the context envelope are structurally excluded. Any missing signal falls back to\n // the full event.\n const shouldSendMinimalFlagCalledEvent =\n event_name === '$feature_flag_called' &&\n data.properties['$feature_flag_has_experiment'] === false &&\n this.get_property(PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS) === true\n\n const setProperties = options?.$set\n if (setProperties && !shouldSendMinimalFlagCalledEvent) {\n data.$set = options?.$set\n }\n const unsetProperties = options?.$unset\n if (unsetProperties) {\n data.$unset = unsetProperties\n }\n // $groupidentify doesn't process person $set_once on the server, so don't mark\n // initial person props as sent. This ensures they're included with subsequent\n // $identify calls.\n const markSetOnceAsSent = event_name !== EVENT_GROUPIDENTIFY\n // $identify should always include initial props because it creates/merges persons\n // and may be processed before earlier anonymous events on the server\n const forceIncludeInitialProps = event_name === EVENT_IDENTIFY\n // Minimal flag-called events must not carry $set_once. Skipping the calculation (rather\n // than dropping its result) avoids marking the initial person props as sent, so they\n // still go out with the next full event.\n const setOnceProperties = shouldSendMinimalFlagCalledEvent\n ? undefined\n : this._calculate_set_once_properties(options?.$set_once, markSetOnceAsSent, forceIncludeInitialProps)\n if (setOnceProperties) {\n data.$set_once = setOnceProperties\n }\n\n if (!options?._noTruncate) {\n data = _copyAndTruncateStrings(data, this.config.properties_string_max_length)\n }\n data.timestamp = timestamp\n if (!isUndefined(options?.timestamp)) {\n data.properties['$event_time_override_provided'] = true\n data.properties['$event_time_override_system_time'] = systemTime\n }\n\n // before_send runs after this filter and may deliberately re-add stripped properties;\n // the SDK itself must not enrich beyond allowlisted keys past this point.\n if (shouldSendMinimalFlagCalledEvent) {\n data.properties = minimizeFlagCalledEventProperties(data.properties, FLAG_CALLED_TRANSPORT_PROPERTY_KEYS)\n }\n\n if (event_name === SurveyEventName.DISMISSED || event_name === SurveyEventName.SENT) {\n const surveyId = properties?.[SurveyEventProperties.SURVEY_ID]\n const surveyIteration = properties?.[SurveyEventProperties.SURVEY_ITERATION]\n setSurveySeenOnLocalStorage({ id: surveyId, current_iteration: surveyIteration })\n data.$set = {\n ...data.$set,\n [getSurveyInteractionProperty(\n { id: surveyId, current_iteration: surveyIteration },\n event_name === SurveyEventName.SENT ? 'responded' : 'dismissed'\n )]: true,\n }\n } else if (event_name === SurveyEventName.SHOWN) {\n data.$set = {\n ...data.$set,\n [SurveyEventProperties.SURVEY_LAST_SEEN_DATE]: new Date().toISOString(),\n }\n }\n\n if (event_name === ProductTourEventName.SHOWN) {\n const tourType = properties?.[ProductTourEventProperties.TOUR_TYPE]\n if (tourType) {\n data.$set = {\n ...data.$set,\n [`${ProductTourEventProperties.TOUR_LAST_SEEN_DATE}/${tourType}`]: new Date().toISOString(),\n }\n }\n }\n\n // Top-level $set overriding values from the one from properties is taken from the plugin-server normalizeEvent\n // This doesn't handle $set_once, because posthog-people doesn't either\n const finalSet = { ...data.properties['$set'], ...data['$set'] }\n if (!isEmptyObject(finalSet)) {\n this.setPersonPropertiesForFlags(finalSet)\n }\n\n if (!isNullish(this.config.before_send)) {\n const beforeSendResult = this._runBeforeSend(data)\n if (!beforeSendResult) {\n return\n } else {\n data = beforeSendResult\n // codeql[js/insecure-randomness] Event UUIDs are identifiers for deduplication, not secrets.\n data.uuid = getEventUuid(data.uuid, uuidv7)\n }\n }\n\n this._internalEventEmitter.emit('eventCaptured', data)\n\n const requestOptions: QueuedRequestWithOptions = {\n method: 'POST',\n url: options?._url ?? this.requestRouter.endpointFor('api', this.analyticsDefaultEndpoint),\n data,\n compression: 'best-available',\n timestampMode: 'query',\n batchKey: options?._batchKey,\n transport: options?.transport,\n }\n\n if (this.config.request_batching && (!options || options?._batchKey) && !options?.send_instantly) {\n this._requestQueue.enqueue(requestOptions)\n } else {\n this._send_retriable_request(requestOptions)\n }\n\n return data\n }\n\n _addCaptureHook(callback: (eventName: string, eventPayload?: CaptureResult) => void): () => void {\n return this.on('eventCaptured', (data) => callback(data.event, data))\n }\n\n /**\n * This method is used internally to calculate the event properties before sending it to PostHog. It can also be\n * used by integrations (e.g. Segment) to enrich events with PostHog properties before sending them to Segment,\n * which is required for some PostHog products to work correctly. (e.g. to have a correct $session_id property).\n *\n * @param {String} eventName The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', '$pageview', etc.\n * @param {Object} eventProperties The properties to include with the event.\n * @param {Date} [timestamp] The timestamp of the event, e.g. for calculating time on page. If not set, it'll automatically be set to the current time.\n * @param {String} [uuid] The uuid of the event, e.g. for storing the $pageview ID.\n * @param {Boolean} [readOnly] Set this if you do not intend to actually send the event, and therefore do not want to update internal state e.g. session timeout\n *\n * @internal\n */\n public calculateEventProperties(\n eventName: string,\n eventProperties: Properties,\n timestamp?: Date,\n uuid?: string,\n readOnly?: boolean\n ): Properties {\n timestamp = timestamp || new Date()\n if (!this.persistence || !this.sessionPersistence) {\n return eventProperties\n }\n\n // set defaults\n const startTimestamp = readOnly ? undefined : this.persistence.remove_event_timer(eventName)\n let properties = { ...eventProperties }\n properties['token'] = this.config.token\n properties['$config_defaults'] = this.config.defaults\n\n if (this._inCookielessMode()) {\n // Set a flag to tell the plugin server to use cookieless server hash mode\n properties[COOKIELESS_MODE_FLAG_PROPERTY] = true\n }\n\n if (eventName === '$snapshot') {\n const persistenceProps = { ...this.persistence.properties(), ...this.sessionPersistence.properties() }\n properties['distinct_id'] = persistenceProps.distinct_id\n if (\n // we spotted one customer that was managing to send `false` for ~9k events a day\n !(isString(properties['distinct_id']) || isNumber(properties['distinct_id'])) ||\n isEmptyString(properties['distinct_id'])\n ) {\n logger.error('Invalid distinct_id for replay event. This indicates a bug in your implementation')\n }\n return properties\n }\n\n const infoProperties = getEventProperties(\n this.config.mask_personal_data_properties,\n this.config.custom_personal_data_properties,\n this.config.detect_google_search_app,\n this.config.disable_capture_url_hashes\n )\n\n if (this.sessionManager) {\n const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId(\n readOnly,\n timestamp.getTime()\n )\n properties['$session_id'] = sessionId\n properties['$window_id'] = windowId\n }\n if (this.sessionPropsManager) {\n extend(properties, this.sessionPropsManager.getSessionProps())\n }\n\n try {\n if (this.sessionRecording) {\n extend(properties, this.sessionRecording.sdkDebugProperties)\n }\n properties['$sdk_debug_retry_queue_size'] = this._retryQueue?.length\n } catch (e: any) {\n properties['$sdk_debug_error_capturing_properties'] = String(e)\n }\n\n if (this.requestRouter.region === RequestRouterRegion.CUSTOM) {\n properties['$lib_custom_api_host'] = this.config.api_host\n }\n\n let pageviewProperties: Record<string, any>\n if (eventName === EVENT_PAGEVIEW && !readOnly) {\n pageviewProperties = this.pageViewManager.doPageView(timestamp, uuid)\n } else if (eventName === EVENT_PAGELEAVE && !readOnly) {\n pageviewProperties = this.pageViewManager.doPageLeave(timestamp)\n } else {\n pageviewProperties = this.pageViewManager.doEvent()\n }\n properties = extend(properties, pageviewProperties)\n\n if (eventName === EVENT_PAGEVIEW && document) {\n properties['title'] = document.title\n }\n\n // set $duration if time_event was previously called for this event\n if (!isUndefined(startTimestamp)) {\n const duration_in_ms = timestamp.getTime() - startTimestamp\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n }\n\n // this is only added when this.config.opt_out_useragent_filter is true,\n // or it would always add \"browser\"\n if (userAgent && this.config.opt_out_useragent_filter) {\n properties['$browser_type'] = this._is_bot() ? 'bot' : 'browser'\n }\n\n // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n\n // $referrer / $referring_domain are written to the sessionPersistence from document.referrer\n // on every capture, and sessionPersistence is merged after the regular persistence below, so\n // they normally win. When the user has explicitly set one of these via posthog.register()\n // (which writes to the regular persistence), let that value win instead. Resolve the\n // precedence per property so a single registered key does not suppress the other, and a\n // stale session value cannot shadow the registered one. Without this an SPA or iframe\n // reports document.referrer (the iframe's own origin) rather than the registered value.\n const persistenceProperties = this.persistence.properties()\n const sessionPersistenceProperties = this.sessionPersistence.properties()\n each(['$referrer', '$referring_domain'], (referrerKey) => {\n if (referrerKey in persistenceProperties) {\n delete sessionPersistenceProperties[referrerKey]\n }\n })\n\n // update properties with pageview info and super-properties\n properties = extend({}, infoProperties, persistenceProperties, sessionPersistenceProperties, properties)\n\n properties['$is_identified'] = this._isIdentified()\n\n if (isArray(this.config.property_denylist)) {\n each(this.config.property_denylist, function (denylisted_prop) {\n delete properties[denylisted_prop]\n })\n } else {\n logger.error(\n DENYLIST_INVALID +\n this.config.property_denylist +\n ' or property_blacklist config: ' +\n this.config.property_blacklist\n )\n }\n\n const sanitize_properties = this.config.sanitize_properties\n if (sanitize_properties) {\n logger.error(SANITIZE_DEPRECATED)\n properties = sanitize_properties(properties, eventName)\n }\n\n // add person processing flag as very last step, so it cannot be overridden\n const hasPersonProcessing = this._hasPersonProcessing()\n properties['$process_person_profile'] = hasPersonProcessing\n // if the event has person processing, ensure that all future events will too, even if the setting changes\n if (hasPersonProcessing && !readOnly) {\n this._requirePersonProcessing('_calculate_event_properties')\n }\n\n return properties\n }\n\n /** @deprecated - deprecated in 1.241.0, use `calculateEventProperties` instead */\n _calculate_event_properties = this.calculateEventProperties.bind(this)\n\n /**\n * Add additional set_once properties to the event when creating a person profile. This allows us to create the\n * profile with mostly-accurate properties, despite earlier events not setting them. We do this by storing them in\n * persistence.\n * @param dataSetOnce\n * @param markAsSent - if true, marks the properties as sent so they won't be included in future events.\n * Set to false for events like $groupidentify where the server doesn't process person props.\n * @param forceIncludeInitialProps - if true, include initial person props even if they've already been sent.\n * Used for $identify which creates/merges persons and may be processed out of order.\n */\n _calculate_set_once_properties(\n dataSetOnce?: Properties,\n markAsSent: boolean = true,\n forceIncludeInitialProps: boolean = false\n ): Properties | undefined {\n if (!this.persistence || !this._hasPersonProcessing()) {\n return dataSetOnce\n }\n\n if (this._personProcessingSetOncePropertiesSent && !forceIncludeInitialProps) {\n // We only need to send these properties once. Sending them with later events would be redundant and would\n // just require extra work on the server to process them.\n return dataSetOnce\n }\n // if we're an identified person, send initial params with every event\n const initialProps = this.persistence.get_initial_props()\n const sessionProps = this.sessionPropsManager?.getSetOnceProps()\n let setOnceProperties = extend({}, initialProps, sessionProps || {}, dataSetOnce || {})\n const sanitize_properties = this.config.sanitize_properties\n if (sanitize_properties) {\n logger.error(SANITIZE_DEPRECATED)\n setOnceProperties = sanitize_properties(setOnceProperties, '$set_once')\n }\n if (markAsSent) {\n this._personProcessingSetOncePropertiesSent = true\n }\n if (isEmptyObject(setOnceProperties)) {\n return undefined\n }\n return setOnceProperties\n }\n\n /**\n * Registers super properties that are included with all events.\n *\n * @remarks\n * Super properties are stored in persistence and automatically added to every event you capture.\n * These values will overwrite any existing super properties with the same keys.\n *\n * @example\n * ```js\n * // register a single property\n * posthog.register({ plan: 'premium' })\n * ```\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register multiple properties\n * posthog.register({\n * email: 'user@example.com',\n * account_type: 'business',\n * signup_date: '2023-01-15'\n * })\n * ```\n *\n * @example\n * ```js\n * // register with custom expiration\n * posthog.register({ campaign: 'summer_sale' }, 7) // expires in 7 days\n * ```\n *\n * @public\n *\n * @param {Object} properties properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n register(properties: Properties, days?: number): void {\n this.persistence?.register(properties, days)\n }\n\n /**\n * Registers super properties only if they haven't been set before.\n *\n * @remarks\n * Unlike `register()`, this method will not overwrite existing super properties.\n * Use this for properties that should only be set once, like signup date or initial referrer.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register once-only properties\n * posthog.register_once({\n * first_login_date: new Date().toISOString(),\n * initial_referrer: document.referrer\n * })\n * ```\n *\n * @example\n * ```js\n * // override existing value if it matches default\n * posthog.register_once(\n * { user_type: 'premium' },\n * 'unknown' // overwrite if current value is 'unknown'\n * )\n * ```\n *\n * @public\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n register_once(properties: Properties, default_value?: Property, days?: number): void {\n this.persistence?.register_once(properties, default_value, days)\n }\n\n /**\n * Registers super properties for the current session only.\n *\n * @remarks\n * Session super properties are automatically added to all events during the current browser session.\n * Unlike regular super properties, these are cleared when the session ends and are stored in sessionStorage.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // register session-specific properties\n * posthog.register_for_session({\n * current_page_type: 'checkout',\n * ab_test_variant: 'control'\n * })\n * ```\n *\n * @example\n * ```js\n * // register properties for user flow tracking\n * posthog.register_for_session({\n * selected_plan: 'pro',\n * completed_steps: 3,\n * flow_id: 'signup_flow_v2'\n * })\n * ```\n *\n * @public\n *\n * @param {Object} properties An associative array of properties to store about the user\n */\n register_for_session(properties: Properties): void {\n this.sessionPersistence?.register(properties)\n }\n\n /**\n * Removes a super property from persistent storage.\n *\n * @remarks\n * This will stop the property from being automatically included in future events.\n * The property will be permanently removed from the user's profile.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // remove a super property\n * posthog.unregister('plan_type')\n * ```\n *\n * @public\n *\n * @param {String} property The name of the super property to remove\n */\n unregister(property: string): void {\n this.persistence?.unregister(property)\n }\n\n /**\n * Removes a session super property from the current session.\n *\n * @remarks\n * This will stop the property from being automatically included in future events for this session.\n * The property is removed from sessionStorage.\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * // remove a session property\n * posthog.unregister_for_session('current_flow')\n * ```\n *\n * @public\n *\n * @param {String} property The name of the session super property to remove\n */\n unregister_for_session(property: string): void {\n this.sessionPersistence?.unregister(property)\n }\n\n _register_single(prop: string, value: Property) {\n this.register({ [prop]: value })\n }\n\n /**\n * Gets the value of a feature flag for the current user.\n *\n * @remarks\n * Returns the feature flag value which can be a boolean, string, or undefined.\n * Supports multivariate flags that can return custom string values.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // check boolean flag\n * if (posthog.getFeatureFlag('new-feature')) {\n * // show new feature\n * }\n * ```\n *\n * @example\n * ```js\n * // check multivariate flag\n * const variant = posthog.getFeatureFlag('button-color')\n * if (variant === 'red') {\n * // show red button\n * }\n * ```\n *\n * @public\n *\n * @param {string} key Key of the feature flag.\n * @param {FeatureFlagOptions} [options] Optional lookup settings. If `{ send_event: false }`, we won't send a `$feature_flag_called` event to PostHog. If `{ fresh: true }`, we won't return cached values from localStorage - only values loaded from the server.\n * @returns {boolean | string | undefined} The feature flag value, or undefined if the flag is unavailable.\n */\n getFeatureFlag(key: string, options?: FeatureFlagOptions): boolean | string | undefined {\n return this.featureFlags?.getFeatureFlag(key, options)\n }\n\n /**\n * Get feature flag payload value matching key for user (supports multivariate flags).\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const betaFeature = posthog.getFeatureFlagResult('beta-feature')\n * if (betaFeature?.variant === 'some-value') {\n * const someValue = betaFeature?.payload\n * // do something\n * }\n * ```\n *\n * @public\n *\n * @deprecated Use `getFeatureFlagResult()` instead\n *\n * @param {string} key Key of the feature flag.\n * @returns {JsonType} The feature flag payload.\n */\n getFeatureFlagPayload(key: string): JsonType {\n return this.featureFlags?.getFeatureFlagPayload(key)\n }\n\n /**\n * Get a feature flag evaluation result including both the flag value and payload.\n *\n * By default, this method emits the `$feature_flag_called` event.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const result = posthog.getFeatureFlagResult('my-flag')\n * if (result?.enabled) {\n * console.log('Flag is enabled with payload:', result.payload)\n * }\n * ```\n *\n * @example\n * ```js\n * // multivariate flag\n * const result = posthog.getFeatureFlagResult('button-color')\n * if (result?.variant === 'red') {\n * showRedButton(result.payload)\n * }\n * ```\n *\n * @public\n *\n * @param {string} key Key of the feature flag.\n * @param {Object} [options] Options for the feature flag lookup.\n * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n * @param {boolean} [options.fresh=false] If true, won't return cached values from localStorage - only values loaded from the server.\n * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n */\n getFeatureFlagResult(key: string, options?: FeatureFlagOptions): FeatureFlagResult | undefined {\n return this.featureFlags?.getFeatureFlagResult(key, options)\n }\n\n /**\n * Returns all currently cached feature flags as `FeatureFlagResult`s. This is a synchronous read of\n * the flags from the last load (no network request); call `reloadFeatureFlags()` first to refresh.\n * Unlike `getFeatureFlag()`, it does not send a `$feature_flag_called` event.\n *\n * @returns {FeatureFlagResult[]} All loaded flags, or an empty array if none are loaded.\n */\n getAllFeatureFlags(): FeatureFlagResult[] {\n return this.featureFlags?.getAllFeatureFlags() ?? []\n }\n\n /**\n * Checks if a feature flag is enabled for the current user.\n *\n * @remarks\n * Returns true if the flag is enabled, false if disabled, or undefined if not found\n * (unless `defaultValue` is given, which is returned instead of undefined).\n * This is a convenience method that treats any truthy value as enabled.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // simple feature flag check\n * if (posthog.isFeatureEnabled('new-checkout')) {\n * showNewCheckout()\n * }\n * ```\n *\n * @example\n * ```js\n * // disable event tracking\n * if (posthog.isFeatureEnabled('feature', { send_event: false })) {\n * // flag checked without sending $feature_flag_called event\n * }\n * ```\n *\n * @public\n *\n * @param {string} key Key of the feature flag.\n * @param {IsFeatureEnabledOptions} [options] Optional lookup settings. If `{ send_event: false }`, we won't send a `$feature_flag_called` event to PostHog. If `{ fresh: true }`, we won't return cached values from localStorage - only values loaded from the server. If `{ defaultValue: false }`, we return that value instead of undefined when the flag has no value.\n * @returns {boolean | undefined} Whether the feature flag is enabled; when the flag has no value, defaultValue if given, otherwise undefined.\n */\n isFeatureEnabled(key: string, options: IsFeatureEnabledOptions & { defaultValue: boolean }): boolean\n isFeatureEnabled(key: string, options?: IsFeatureEnabledOptions): boolean | undefined\n isFeatureEnabled(key: string, options?: IsFeatureEnabledOptions): boolean | undefined {\n return this.featureFlags?.isFeatureEnabled(key, options) ?? options?.defaultValue\n }\n\n /**\n * Feature flag values are cached. If something has changed with your user and you'd like to refetch their flag values, call this method.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * posthog.reloadFeatureFlags()\n * ```\n *\n * @public\n */\n reloadFeatureFlags(): void {\n this.featureFlags?.reloadFeatureFlags()\n }\n\n /**\n * Manually update feature flag values without making a network request.\n *\n * This is useful when you have feature flag values from an external source\n * (e.g., server-side evaluation, edge middleware) and want to inject them\n * into the client SDK.\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // Replace all flags with server-evaluated values\n * posthog.updateFlags({\n * 'my-flag': true,\n * 'my-experiment': 'variant-a'\n * })\n *\n * // Merge with existing flags (update only specified flags)\n * posthog.updateFlags(\n * { 'my-flag': true },\n * undefined,\n * { merge: true }\n * )\n *\n * // With payloads\n * posthog.updateFlags(\n * { 'my-flag': true },\n * { 'my-flag': { some: 'data' } }\n * )\n * ```\n *\n * @param flags - An object mapping flag keys to their values (boolean or string variant)\n * @param payloads - Optional object mapping flag keys to their JSON payloads\n * @param options - Optional settings. Use `{ merge: true }` to merge with existing flags instead of replacing.\n * @public\n */\n updateFlags(\n flags: Record<string, boolean | string>,\n payloads?: Record<string, JsonType>,\n options?: { merge?: boolean }\n ): void {\n this.featureFlags?.updateFlags(flags, payloads, options)\n }\n\n /**\n * Opt the user in or out of an early access feature. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const toggleBeta = (betaKey) => {\n * if (activeBetas.some(\n * beta => beta.flagKey === betaKey\n * )) {\n * posthog.updateEarlyAccessFeatureEnrollment(\n * betaKey,\n * false\n * )\n * setActiveBetas(\n * prevActiveBetas => prevActiveBetas.filter(\n * item => item.flagKey !== betaKey\n * )\n * );\n * return\n * }\n *\n * posthog.updateEarlyAccessFeatureEnrollment(\n * betaKey,\n * true\n * )\n * setInactiveBetas(\n * prevInactiveBetas => prevInactiveBetas.filter(\n * item => item.flagKey !== betaKey\n * )\n * );\n * }\n *\n * const registerInterest = (featureKey) => {\n * posthog.updateEarlyAccessFeatureEnrollment(\n * featureKey,\n * true\n * )\n * // Update UI to show user has registered\n * }\n * ```\n *\n * @public\n *\n * @param {String} key The key of the feature flag to update.\n * @param {Boolean} isEnrolled Whether the user is enrolled in the feature.\n * @param {String} [stage] The stage of the feature flag to update.\n */\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n this.featureFlags?.updateEarlyAccessFeatureEnrollment(key, isEnrolled, stage)\n }\n\n /**\n * Get the list of early access features. To check enrollment status, use `isFeatureEnabled`. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * const posthog = usePostHog()\n * const activeFlags = useActiveFeatureFlags()\n *\n * const [activeBetas, setActiveBetas] = useState([])\n * const [inactiveBetas, setInactiveBetas] = useState([])\n * const [comingSoonFeatures, setComingSoonFeatures] = useState([])\n *\n * useEffect(() => {\n * posthog.getEarlyAccessFeatures((features) => {\n * // Filter features by stage\n * const betaFeatures = features.filter(feature => feature.stage === 'beta')\n * const conceptFeatures = features.filter(feature => feature.stage === 'concept')\n *\n * setComingSoonFeatures(conceptFeatures)\n *\n * if (!activeFlags || activeFlags.length === 0) {\n * setInactiveBetas(betaFeatures)\n * return\n * }\n *\n * const activeBetas = betaFeatures.filter(\n * beta => activeFlags.includes(beta.flagKey)\n * );\n * const inactiveBetas = betaFeatures.filter(\n * beta => !activeFlags.includes(beta.flagKey)\n * );\n * setActiveBetas(activeBetas)\n * setInactiveBetas(inactiveBetas)\n * }, true, ['concept', 'beta'])\n * }, [activeFlags])\n * ```\n *\n * @public\n *\n * @param {Function} callback The callback function will be called when the early access features are loaded.\n * @param {Boolean} [force_reload] Whether to force a reload of the early access features.\n * @param {String[]} [stages] The stages of the early access features to load.\n */\n getEarlyAccessFeatures(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n return this.featureFlags?.getEarlyAccessFeatures(callback, force_reload, stages)\n }\n\n /**\n * Exposes a set of events that PostHog will emit.\n * e.g. `eventCaptured` is emitted immediately before trying to send an event\n *\n * Unlike `onFeatureFlags` and `onSessionId` these are not called when the\n * listener is registered, the first callback will be the next event\n * _after_ registering a listener\n *\n * Available events:\n * - `eventCaptured`: Emitted immediately before trying to send an event\n * - `featureFlagsReloading`: Emitted when feature flags are being reloaded (e.g. after `identify()`, `group()`, or `reloadFeatureFlags()`)\n *\n * {@label Capture}\n *\n * @example\n * ```js\n * posthog.on('eventCaptured', (event) => {\n * console.log(event)\n * })\n * ```\n *\n * @example\n * ```js\n * // Track when feature flags are reloading to show a loading state\n * posthog.on('featureFlagsReloading', () => {\n * console.log('Feature flags are being reloaded...')\n * })\n * ```\n *\n * @public\n *\n * @param {String} event The event to listen for.\n * @param {Function} cb The callback function to call when the event is emitted.\n * @returns {Function} A function that can be called to unsubscribe the listener.\n */\n on(event: 'eventCaptured' | 'featureFlagsReloading', cb: (...args: any[]) => void): () => void {\n return this._internalEventEmitter.on(event, cb)\n }\n\n /**\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n * Note that this is not called only when we fetch feature flags from the server, but also when they change in the browser.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) {\n * // do something\n * })\n * ```\n *\n * @param callback - The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\n * @returns A function that can be called to unsubscribe the listener. Used by `useEffect` when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n if (!this.featureFlags) {\n callback([], {}, { errorsLoading: true })\n return () => {}\n }\n return this.featureFlags.onFeatureFlags(callback)\n }\n\n /**\n * Register an event listener that runs when surveys are loaded.\n *\n * Callback parameters:\n * - surveys: Survey[]: An array containing all survey objects fetched from PostHog using the getSurveys method\n * - context: { isLoaded: boolean, error?: string }: An object indicating if the surveys were loaded successfully\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.onSurveysLoaded((surveys, context) => { // do something })\n * ```\n *\n * @param {SurveyCallback} callback The callback function will be called when surveys are loaded or updated.\n * @returns A function that can be called to unsubscribe the listener.\n */\n onSurveysLoaded(callback: SurveyCallback): () => void {\n if (!this.surveys) {\n callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n return () => {}\n }\n return this.surveys.onSurveysLoaded(callback)\n }\n\n /**\n * Register an event listener that runs whenever the session id or window id change.\n * If there is already a session id, the listener is called immediately in addition to being called on future changes.\n *\n * Can be used, for example, to sync the PostHog session id with a backend session.\n *\n * {@label Identification}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.onSessionId(function(sessionId, windowId) { // do something })\n * ```\n *\n * @param {Function} [callback] The callback function will be called once a session id is present or when it or the window id are updated.\n * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by `useEffect` when the component unmounts.\n */\n onSessionId(callback: SessionIdChangedCallback): () => void {\n return this.sessionManager?.onSessionId(callback) ?? (() => {})\n }\n\n /**\n * Get list of all surveys.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * function callback(surveys, context) {\n * // do something\n * }\n *\n * posthog.getSurveys(callback, false)\n * ```\n *\n * @public\n *\n * @param {SurveyCallback} callback Function that receives the array of surveys.\n * @param {boolean} [forceReload] Optional boolean to force an API call for updated surveys.\n */\n getSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys\n ? this.surveys.getSurveys(callback, forceReload)\n : callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n }\n\n /**\n * Get surveys that should be enabled for the current user. See [fetching surveys documentation](/docs/surveys/implementing-custom-surveys#fetching-surveys-manually) for more details.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.getActiveMatchingSurveys((surveys) => {\n * // do something\n * })\n * ```\n *\n * @public\n *\n * @param {SurveyCallback} callback The callback function will be called when the surveys are loaded or updated.\n * @param {boolean} [forceReload] Whether to force a reload of the surveys.\n */\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false): void {\n this.surveys\n ? this.surveys.getActiveMatchingSurveys(callback, forceReload)\n : callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n }\n\n /**\n * Although we recommend using popover surveys and display conditions,\n * if you want to show surveys programmatically without setting up all\n * the extra logic needed for API surveys, you can render surveys\n * programmatically with the renderSurvey method.\n *\n * This takes a survey ID and an HTML selector to render an unstyled survey.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.renderSurvey(coolSurveyID, '#survey-container')\n * ```\n *\n * @deprecated Use displaySurvey instead - it's more complete and also supports popover surveys.\n *\n * @public\n *\n * @param {String} surveyId The ID of the survey to render.\n * @param {String} selector The selector of the HTML element to render the survey on.\n */\n renderSurvey(surveyId: string, selector: string): void {\n this.surveys?.renderSurvey(surveyId, selector)\n }\n\n /**\n * Display a survey programmatically as either a popover or inline element.\n *\n * @param {string} surveyId The survey ID to display.\n * @param {DisplaySurveyOptions} [options] Display configuration. Defaults to a popover that respects dashboard conditions and delays.\n *\n * @example\n * ```js\n * // Display as popover (respects all conditions defined in the dashboard)\n * posthog.displaySurvey('survey-id-123')\n * ```\n *\n * @example\n * ```js\n * // Display inline in a specific element\n * posthog.displaySurvey('survey-id-123', {\n * displayType: DisplaySurveyType.Inline,\n * ignoreConditions: false,\n * ignoreDelay: false,\n * selector: '#survey-container'\n * })\n * ```\n *\n * @example\n * ```js\n * // Force display ignoring conditions and delays\n * posthog.displaySurvey('survey-id-123', {\n * displayType: DisplaySurveyType.Popover,\n * ignoreConditions: true,\n * ignoreDelay: true\n * })\n * ```\n *\n * {@label Surveys}\n */\n displaySurvey(surveyId: string, options: DisplaySurveyOptions = DEFAULT_DISPLAY_SURVEY_OPTIONS): void {\n this.surveys?.displaySurvey(surveyId, options)\n }\n\n /**\n * Cancels a pending survey that is waiting to be displayed (e.g., due to a popup delay).\n *\n * {@label Surveys}\n *\n * @param {string} surveyId The survey ID whose pending display should be cancelled.\n */\n cancelPendingSurvey(surveyId: string): void {\n this.surveys?.cancelPendingSurvey(surveyId)\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n * This method is deprecated because it's synchronous and won't return the correct result if surveys are not loaded.\n * Use `canRenderSurveyAsync` instead.\n *\n * {@label Surveys}\n *\n * @public\n * @deprecated\n *\n * @param surveyId The ID of the survey to check.\n * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n */\n canRenderSurvey(surveyId: string): SurveyRenderReason | null {\n return (\n this.surveys?.canRenderSurvey(surveyId) ?? {\n visible: false,\n disabledReason: SURVEYS_NOT_AVAILABLE,\n }\n )\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n *\n * {@label Surveys}\n *\n * @example\n * ```js\n * posthog.canRenderSurveyAsync(surveyId).then((result) => {\n * if (result.visible) {\n * // Survey can be rendered\n * console.log('Survey can be rendered')\n * } else {\n * // Survey cannot be rendered\n * console.log('Survey cannot be rendered:', result.disabledReason)\n * }\n * })\n * ```\n *\n * @public\n *\n * @param surveyId The ID of the survey to check.\n * @param forceReload If true, the survey will be reloaded from the server, Default: false\n * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n */\n canRenderSurveyAsync(surveyId: string, forceReload = false): Promise<SurveyRenderReason> {\n return (\n this.surveys?.canRenderSurveyAsync(surveyId, forceReload) ??\n // eslint-disable-next-line compat/compat\n Promise.resolve({ visible: false, disabledReason: SURVEYS_NOT_AVAILABLE })\n )\n }\n\n private _validateIdentifyId(id: string | undefined): id is string {\n if (!id || isEmptyString(id)) {\n logger.critical('Unique user id has not been set in posthog.identify')\n return false\n }\n if (id === COOKIELESS_SENTINEL_VALUE) {\n logger.critical(\n `The string \"${id}\" was set in posthog.identify which indicates an error. This ID is only used as a sentinel value.`\n )\n return false\n }\n if (isDistinctIdStringLike(id) || ['undefined', 'null'].includes(id.toLowerCase())) {\n logger.critical(\n `The string \"${id}\" was set in posthog.identify which indicates an error. This ID should be unique to the user and not a hardcoded string.`\n )\n return false\n }\n return true\n }\n\n /**\n * Associates a user with a unique identifier instead of an auto-generated ID.\n * Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * By default, PostHog assigns each user a randomly generated `distinct_id`. Use this method to\n * replace that ID with your own unique identifier (like a user ID from your database).\n *\n * @example\n * ```js\n * // basic identification\n * posthog.identify('user_12345')\n * ```\n *\n * @example\n * ```js\n * // identify with user properties\n * posthog.identify('user_12345', {\n * email: 'user@example.com',\n * plan: 'premium'\n * })\n * ```\n *\n * @example\n * ```js\n * // identify with set and set_once properties\n * posthog.identify('user_12345',\n * { last_login: new Date() }, // updates every time\n * { signup_date: new Date() } // sets only once\n * )\n * ```\n *\n * @public\n *\n * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n * it will be overwritten by the value in userPropertiesToSet.\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!this.__loaded || !this.persistence) {\n return logger.uninitializedWarning('posthog.identify')\n }\n if (isNumber(new_distinct_id)) {\n new_distinct_id = (new_distinct_id as number).toString()\n logger.warn(\n 'The first argument to posthog.identify was a number, but it should be a string. It has been converted to a string.'\n )\n }\n\n if (!this._validateIdentifyId(new_distinct_id)) {\n return\n }\n\n if (!this._requirePersonProcessing('posthog.identify')) {\n return\n }\n\n const previous_distinct_id = this.get_distinct_id()\n this.register({ $user_id: new_distinct_id })\n\n if (!this.get_property(DEVICE_ID)) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n const device_id = previous_distinct_id\n this.register_once(\n {\n $had_persisted_distinct_id: true,\n $device_id: device_id,\n },\n ''\n )\n }\n\n // if the previous distinct id had an alias stored, then we clear it\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY)\n this.register({ distinct_id: new_distinct_id })\n }\n\n const isKnownAnonymous =\n (this.persistence.get_property(USER_STATE) || USER_STATE_ANONYMOUS) === USER_STATE_ANONYMOUS\n\n // send an $identify event any time the distinct_id is changing and the old ID is an anonymous ID\n // - logic on the server will determine whether or not to do anything with it.\n if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n this.persistence.set_property(USER_STATE, USER_STATE_IDENTIFIED)\n\n // Update current user properties\n this.setPersonPropertiesForFlags(\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} },\n false\n )\n\n this.capture(\n EVENT_IDENTIFY,\n {\n distinct_id: new_distinct_id,\n $anon_distinct_id: previous_distinct_id,\n },\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n )\n\n this._cachedPersonProperties = getPersonPropertiesHash(\n new_distinct_id,\n userPropertiesToSet,\n userPropertiesToSetOnce\n )\n\n // let the reload feature flag request know to send this previous distinct id\n // for flag consistency\n this.featureFlags?.setAnonymousDistinctId(previous_distinct_id)\n } else if (userPropertiesToSet || userPropertiesToSetOnce) {\n // If the distinct_id is not changing, but we have user properties to set, we can check if they have changed\n // and if so, send a $set event\n\n this.setPersonProperties(userPropertiesToSet, userPropertiesToSetOnce)\n }\n\n // Reload active feature flags if the user identity changes.\n // Note we don't reload this on property changes as these get processed async\n if (new_distinct_id !== previous_distinct_id) {\n this.reloadFeatureFlags()\n // also clear any stored flag calls\n this.unregister(FLAG_CALL_REPORTED)\n }\n }\n\n /**\n * Sets properties on the person profile associated with the current `distinct_id`.\n * Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * Updates user properties that are stored with the person profile in PostHog.\n * If `person_profiles` is set to `identified_only` and no profile exists, this will create one.\n *\n * @example\n * ```js\n * // set user properties\n * posthog.setPersonProperties({\n * email: 'user@example.com',\n * plan: 'premium'\n * })\n * ```\n *\n * @example\n * ```js\n * // set properties\n * posthog.setPersonProperties(\n * { name: 'Max Hedgehog' }, // $set properties\n * { initial_url: '/blog' } // $set_once properties\n * )\n * ```\n *\n * @public\n *\n * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n * it will be overwritten by the value in userPropertiesToSet.\n * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n */\n setPersonProperties(userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n if (!userPropertiesToSet && !userPropertiesToSetOnce) {\n return\n }\n\n if (!this._requirePersonProcessing('posthog.setPersonProperties')) {\n return\n }\n\n const hash = getPersonPropertiesHash(this.get_distinct_id(), userPropertiesToSet, userPropertiesToSetOnce)\n\n // if exactly this $set call has been sent before, don't send it again - determine based on hash of properties\n if (this._cachedPersonProperties === hash) {\n logger.info('A duplicate setPersonProperties call was made with the same properties. It has been ignored.')\n return\n }\n\n // Update current user properties\n this.setPersonPropertiesForFlags(\n { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} },\n true\n )\n\n this.capture('$set', { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} })\n\n this._cachedPersonProperties = hash\n }\n\n /**\n * Removes properties from the person profile associated with the current `distinct_id`.\n * Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * Deletes the given person properties from the person profile in PostHog. This is the\n * counterpart to {@link setPersonProperties} — instead of hand-passing `$unset` inside a\n * `capture()` call, you can remove properties with a dedicated method.\n * If `person_profiles` is set to `never`, this call is ignored.\n *\n * @example\n * ```js\n * // remove a single property\n * posthog.unsetPersonProperties('plan')\n * ```\n *\n * @example\n * ```js\n * // remove multiple properties\n * posthog.unsetPersonProperties(['plan', 'email'])\n * ```\n *\n * @public\n *\n * @param {String|String[]} propertyNames The name (or names) of the person properties to remove.\n */\n unsetPersonProperties(propertyNames: string | string[]): void {\n const names = (isArray(propertyNames) ? propertyNames : [propertyNames]).filter(\n (name) => isString(name) && name.length > 0\n )\n if (names.length === 0) {\n return\n }\n\n if (!this._requirePersonProcessing('posthog.unsetPersonProperties')) {\n return\n }\n\n // Remove the properties from the locally-stored person properties used for flag evaluation\n // so flags re-evaluate without the unset values, mirroring setPersonPropertiesForFlags.\n this.featureFlags?.unsetPersonPropertiesForFlags(names, true)\n\n this.capture('$set', { $unset: names })\n\n // Invalidate the setPersonProperties dedupe cache so a subsequent set of an unset\n // property is not skipped as a duplicate.\n this._cachedPersonProperties = null\n }\n\n /**\n * Associates the user with a group for group-based analytics.\n * Learn more about [groups](/docs/product-analytics/group-analytics)\n *\n * {@label Identification}\n *\n * @remarks\n * Groups allow you to analyze users collectively (e.g., by organization, team, or account).\n * This sets the group association for all subsequent events and reloads feature flags.\n *\n * @example\n * ```js\n * // associate user with an organization\n * posthog.group('organization', 'org_12345', {\n * name: 'Acme Corp',\n * plan: 'enterprise'\n * })\n * ```\n *\n * @example\n * ```js\n * // associate with multiple group types\n * posthog.group('organization', 'org_12345')\n * posthog.group('team', 'team_67890')\n * ```\n *\n * @public\n *\n * @param {String} groupType Group type (example: 'organization')\n * @param {String} groupKey Group key (example: 'org::5')\n * @param {Object} groupPropertiesToSet Optional properties to set for group\n */\n group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n if (!groupType || !groupKey) {\n logger.error('posthog.group requires a group type and group key')\n return\n }\n\n const existingGroups = this.getGroups()\n const isNewGroup = existingGroups[groupType] !== groupKey\n\n // if group key changes, remove stored group properties\n if (isNewGroup) {\n this.resetGroupPropertiesForFlags(groupType)\n }\n\n this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n // Send $groupidentify when the group is new/changed OR when properties\n // are provided. Skip only when the group already exists with the same\n // key and no new properties are being set.\n if (isNewGroup || groupPropertiesToSet) {\n const groupIdentifyProperties: Properties = {\n $group_type: groupType,\n $group_key: groupKey,\n }\n if (groupPropertiesToSet) {\n groupIdentifyProperties.$group_set = groupPropertiesToSet\n }\n this.capture(EVENT_GROUPIDENTIFY, groupIdentifyProperties)\n }\n\n if (groupPropertiesToSet) {\n this.setGroupPropertiesForFlags({ [groupType]: groupPropertiesToSet })\n }\n\n // If groups change and no properties change, reload feature flags.\n // The property change reload case is handled in setGroupPropertiesForFlags.\n if (isNewGroup && !groupPropertiesToSet) {\n this.reloadFeatureFlags()\n }\n }\n\n /**\n * Resets only the group properties of the user currently logged in.\n * Learn more about [groups](/docs/product-analytics/group-analytics)\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * posthog.resetGroups()\n * ```\n *\n * @public\n */\n resetGroups(): void {\n this.register({ $groups: {} })\n this.resetGroupPropertiesForFlags()\n\n // If groups changed, reload feature flags.\n this.reloadFeatureFlags()\n }\n\n /**\n * Sometimes, you might want to evaluate feature flags using properties that haven't been ingested yet,\n * or were set incorrectly earlier. You can do so by setting properties the flag depends on with these calls:\n *\n * {@label Feature flags}\n *\n * @example\n * ```js\n * // Set properties\n * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'})\n * ```\n *\n * @example\n * ```js\n * // Set properties without reloading\n * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'}, false)\n * ```\n *\n * @public\n *\n * @param {Object} properties The properties to override.\n * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n this.featureFlags?.setPersonPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n /**\n * Resets the person properties for feature flags.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.resetPersonPropertiesForFlags()\n * ```\n *\n * @example\n * ```js\n * // Reset properties without reloading\n * posthog.resetPersonPropertiesForFlags(false)\n * ```\n *\n * @param {Boolean} [reloadFeatureFlags=true] Whether to reload feature flags.\n */\n resetPersonPropertiesForFlags(reloadFeatureFlags = true): void {\n this.featureFlags?.resetPersonPropertiesForFlags(reloadFeatureFlags)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * // Set properties with reload\n * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n * ```\n *\n * @example\n * ```js\n * // Set properties without reload\n * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } }, false)\n * ```\n *\n * @param {Object} properties The properties to override, the key of which is the group type.\n * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n if (!this._requirePersonProcessing('posthog.setGroupPropertiesForFlags')) {\n return\n }\n this.featureFlags?.setGroupPropertiesForFlags(properties, reloadFeatureFlags)\n }\n\n /**\n * Resets the group properties for feature flags.\n *\n * {@label Feature flags}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.resetGroupPropertiesForFlags()\n * ```\n *\n * @param {string} [group_type] Optional group type to reset. If omitted, all group properties are reset.\n */\n resetGroupPropertiesForFlags(group_type?: string): void {\n this.featureFlags?.resetGroupPropertiesForFlags(group_type)\n }\n\n /**\n * Resets all user data and starts a fresh session.\n *\n * ⚠️ **Warning**: Only call this when a user logs out. Calling at the wrong time can cause split sessions.\n *\n * This clears:\n * - Session ID and super properties\n * - User identification (sets new random distinct_id)\n * - Cached data and consent settings\n *\n * {@label Identification}\n * @example\n * ```js\n * // reset on user logout\n * function logout() {\n * posthog.reset()\n * // redirect to login page\n * }\n * ```\n *\n * @example\n * ```js\n * // reset and generate new device ID\n * posthog.reset(true) // also resets device_id\n * ```\n *\n * @public\n *\n * @param {boolean} [reset_device_id] Whether to generate a new device ID as well as a new distinct ID.\n */\n reset(reset_device_id?: boolean): void {\n logger.info('reset')\n if (!this.__loaded) {\n return logger.uninitializedWarning('posthog.reset')\n }\n const device_id = this.get_property(DEVICE_ID)\n // $device_model describes the physical device, not the user, so preserve it across reset()\n // the same way $device_id is — it is only ever re-resolved at init.\n const device_model = this.get_property(DEVICE_MODEL)\n // Snapshot the session-recording remote config before clearing persistence.\n // It's server-defined config (sample rate, masking, canvas, triggers, …),\n // not user state, and must survive reset(). Otherwise start('session_id_changed')\n // bails on the next session rotation: rrweb is torn down with no replacement\n // and the new session opens with no FullSnapshot until the next periodic\n // checkout (~5 min later).\n const recordingRemoteConfig = this.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n\n this.consent.reset()\n this.persistence?.clear()\n this.sessionPersistence?.clear()\n\n if (!isUndefined(recordingRemoteConfig)) {\n this.persistence?.register({ [SESSION_RECORDING_REMOTE_CONFIG]: recordingRemoteConfig })\n }\n this.surveys?.reset()\n // Stop the refresh interval before resetting flags — featureFlags.reset() clears\n // the debouncer, so if the order were reversed a pending refresh could fire after reset.\n this._remoteConfigLoader?.stop()\n this.featureFlags?.reset()\n this.conversations?.reset()\n this.logs?.reset()\n this.metrics?.reset()\n this.persistence?.set_property(USER_STATE, USER_STATE_ANONYMOUS)\n this.sessionManager?.resetSessionId()\n this._cachedPersonProperties = null\n if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n this.register_once(\n {\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n },\n ''\n )\n } else {\n const uuid = this.config.get_device_id(uuidv7())\n this.register_once(\n {\n distinct_id: uuid,\n $device_id: reset_device_id ? uuid : device_id,\n },\n ''\n )\n if (!reset_device_id && !isUndefined(device_model)) {\n this.register({ [DEVICE_MODEL]: device_model })\n }\n }\n\n this.register(\n {\n $last_posthog_reset: new Date().toISOString(),\n },\n 1\n )\n\n // Clear HMAC identity verification fields\n delete this.config.identity_distinct_id\n delete this.config.identity_hash\n\n // Reload feature flags for the new anonymous user, just like identify()\n // does when the distinct_id changes.\n this.reloadFeatureFlags()\n }\n\n /**\n * Flushes any queued events and resolves once teardown is complete.\n *\n * @remarks\n * This exists primarily for parity with the server-side\n * [Node.js SDK](/docs/libraries/node), whose `shutdown()` you call once before a\n * process exits. In the browser there is no process to exit — the SDK already\n * flushes pending events on `pagehide`/`unload` — so this method is mostly a\n * graceful no-op that best-effort flushes the request queues and always resolves.\n *\n * It is safe to call in isomorphic teardown code (for example a Nuxt/Next module\n * that calls `shutdown()` on both the server and the client) so the same\n * symmetric cleanup works in either environment without throwing.\n *\n * {@label Lifecycle}\n * @example\n * ```js\n * // symmetric teardown that runs on both server and client\n * await posthog.shutdown()\n * ```\n *\n * @public\n *\n * @param {number} [_shutdownTimeoutMs] Accepted for call-site parity with the Node.js SDK. The browser flush is synchronous, so this is ignored.\n * @returns {Promise<void>} A promise that resolves once the queues have been flushed.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async shutdown(_shutdownTimeoutMs?: number): Promise<void> {\n if (!this.__loaded) {\n logger.uninitializedWarning('posthog.shutdown')\n return\n }\n\n // Best-effort flush of anything still queued, mirroring page-unload teardown\n // so no buffered events are silently dropped when teardown is explicit.\n this.logs?.flushLogs('sendBeacon')\n void this.metrics?.flush('sendBeacon')\n this._requestQueue?.unload()\n this._retryQueue?.unload()\n this.featureFlags?.destroy()\n }\n\n /**\n * Set HMAC-based identity verification.\n *\n * @remarks\n * When set, products like conversations use server-verified identity\n * (distinct_id + HMAC hash) instead of anonymous session identifiers.\n * The hash should be computed server-side as HMAC-SHA256 of the\n * distinct_id using the project's API secret.\n *\n * @param distinctId - The verified user distinct_id\n * @param hash - HMAC-SHA256 of distinctId using the project API secret\n *\n * @example\n * ```js\n * posthog.setIdentity('user_123', 'a1b2c3d4e5f6...')\n * ```\n *\n * @public\n */\n setIdentity(distinctId: string, hash: string): void {\n this.config.identity_distinct_id = distinctId\n this.config.identity_hash = hash\n this.alias(distinctId)\n this.conversations?._onIdentityChanged()\n }\n\n /**\n * Clear HMAC-based identity verification, reverting to anonymous mode.\n *\n * @example\n * ```js\n * posthog.clearIdentity()\n * ```\n *\n * @public\n */\n clearIdentity(): void {\n delete this.config.identity_distinct_id\n delete this.config.identity_hash\n this.conversations?._onIdentityCleared()\n }\n\n /**\n * Returns the current distinct ID for the user.\n *\n * @remarks\n * This is either the auto-generated ID or the ID set via `identify()`.\n * The distinct ID is used to associate events with users in PostHog.\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * // get the current user ID\n * const userId = posthog.get_distinct_id()\n * console.log('Current user:', userId)\n * ```\n *\n * @example\n * ```js\n * // use in loaded callback\n * posthog.init('token', {\n * loaded: (posthog) => {\n * const id = posthog.get_distinct_id()\n * // use the ID\n * }\n * })\n * ```\n *\n * @public\n *\n * @returns The current distinct ID\n */\n get_distinct_id(): string {\n return this.get_property('distinct_id')\n }\n\n /**\n * Returns the current groups.\n *\n * {@label Identification}\n *\n * @public\n *\n * @returns The current groups\n */\n getGroups(): Record<string, any> {\n return this.get_property('$groups') || {}\n }\n\n /**\n * Returns the current session_id.\n *\n * @remarks\n * This should only be used for informative purposes.\n * Any actual internal use case for the session_id should be handled by the sessionManager.\n *\n * @public\n *\n * @returns The stored session ID for the current session. This may be an empty string if the client is not yet fully initialized.\n */\n get_session_id(): string {\n return this.sessionManager?.checkAndGetSessionAndWindowId(true).sessionId ?? ''\n }\n\n /**\n * Returns the Replay url for the current session.\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // basic usage\n * posthog.get_session_replay_url()\n * ```\n *\n * @example\n * ```js\n * // timestamp\n * posthog.get_session_replay_url({ withTimestamp: true })\n * ```\n *\n * @example\n * ```js\n * // timestamp and lookback\n * posthog.get_session_replay_url({\n * withTimestamp: true,\n * timestampLookBack: 30 // look back 30 seconds\n * })\n * ```\n *\n * @param {Object} [options] Options for the URL.\n * @param {boolean} [options.withTimestamp] Whether to include the timestamp in the URL.\n * @param {number} [options.timestampLookBack] How many seconds to look back for the timestamp.\n * @returns The URL for the current session replay, or an empty string if sessions are unavailable.\n */\n get_session_replay_url(options?: { withTimestamp?: boolean; timestampLookBack?: number }): string {\n if (!this.sessionManager) {\n return ''\n }\n const { sessionId, sessionStartTimestamp } = this.sessionManager.checkAndGetSessionAndWindowId(true)\n let url = this.requestRouter.endpointFor('ui', `/project/${this.config.token}/replay/${sessionId}`)\n if (options?.withTimestamp && sessionStartTimestamp) {\n const LOOK_BACK = options.timestampLookBack ?? 10\n if (!sessionStartTimestamp) {\n return url\n }\n const recordingStartTime = Math.max(\n Math.floor((new Date().getTime() - sessionStartTimestamp) / 1000) - LOOK_BACK,\n 0\n )\n url += `?t=${recordingStartTime}`\n }\n\n return url\n }\n\n /**\n * Creates an alias linking two distinct user identifiers. Learn more about [identifying users](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @remarks\n * PostHog will use this to link two distinct_ids going forward (not retroactively).\n * Call this when a user signs up to connect their anonymous session with their account.\n *\n *\n * @example\n * ```js\n * // link anonymous user to account on signup\n * posthog.alias('user_12345')\n * ```\n *\n * @example\n * ```js\n * // explicit alias with original ID\n * posthog.alias('user_12345', 'anonymous_abc123')\n * ```\n *\n * @public\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n * @returns The `$create_alias` capture result, `-1` if alias matches the current distinct ID, `-2` if aliasing would duplicate a People user, or void if person processing is disabled.\n */\n alias(alias: string, original?: string): CaptureResult | void | number {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n logger.critical('Attempting to create alias for existing People user - aborting.')\n return -2\n }\n if (!this._requirePersonProcessing('posthog.alias')) {\n return\n }\n\n if (isUndefined(original)) {\n original = this.get_distinct_id()\n }\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias)\n return this.capture('$create_alias', { alias: alias, distinct_id: original })\n } else {\n logger.warn('alias matches current distinct_id - skipping api call.')\n this.identify(alias)\n return -1\n }\n }\n\n /**\n * Updates the configuration of the PostHog instance.\n *\n * {@label Initialization}\n *\n * @public\n *\n * @param {Partial<PostHogConfig>} config A dictionary of new configuration values to update\n */\n set_config(config: Partial<PostHogConfig>): void {\n const oldConfig = { ...this.config }\n if (isObject(config)) {\n extend(this.config, configRenames(config))\n\n const isPersistenceDisabled = this._is_persistence_disabled()\n this.persistence?.update_config(this.config, oldConfig, isPersistenceDisabled)\n this.sessionPersistence =\n this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n ? this.persistence\n : // sessionStorage sibling shares the primary's storage name; it must not own/clean the split group entries\n new PostHogPersistence(\n { ...this.config, persistence: 'sessionStorage' },\n isPersistenceDisabled,\n false\n )\n\n const debugConfigFromLocalStorage = this._checkLocalStorageForDebug(this.config.debug)\n if (isBoolean(debugConfigFromLocalStorage)) {\n this.config.debug = debugConfigFromLocalStorage\n }\n\n if (isBoolean(this.config.debug)) {\n if (this.config.debug) {\n Config.DEBUG = true\n localStore._is_supported() && localStore._set('ph_debug', true)\n logger.info('set_config', {\n config,\n oldConfig,\n newConfig: { ...this.config },\n })\n } else {\n Config.DEBUG = false\n localStore._is_supported() && localStore._remove('ph_debug')\n }\n }\n\n this.exceptionObserver?.onConfigChange()\n this.exceptions?.onConfigChange()\n\n this.sessionRecording?.startIfEnabledOrStop()\n this.tracingHeaders?.startIfEnabledOrStop()\n this.autocapture?.startIfEnabled()\n this.heatmaps?.startIfEnabled()\n this.exceptionObserver?.startIfEnabledOrStop()\n this.deadClicksAutocapture?.startIfEnabledOrStop()\n this.surveys?.loadIfEnabled()\n this._sync_opt_out_with_persistence()\n this.externalIntegrations?.startIfEnabledOrStop()\n }\n }\n\n /**\n * @internal\n * Allows wrapper SDKs (e.g. posthog-flutter, posthog-react-native) to override the\n * `$lib` and `$lib_version` properties sent with every event.\n *\n * This is not a public API and may change without notice.\n */\n _overrideSDKInfo(sdkName: string, sdkVersion: string): void {\n Config.LIB_NAME = sdkName\n Config.LIB_VERSION = sdkVersion\n }\n\n /**\n * turns session recording on, and updates the config option `disable_session_recording` to false\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Start and ignore controls\n * posthog.startSessionRecording(true)\n * ```\n *\n * @example\n * ```js\n * // Start and override controls\n * posthog.startSessionRecording({\n * // you don't have to send all of these\n * sampling: true || false,\n * linked_flag: true || false,\n * url_trigger: true || false,\n * event_trigger: true || false\n * })\n * ```\n *\n * @param override.sampling - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling config.\n * @param override.linked_flag - optional boolean to override the default linked_flag behavior - ensures the next session recording to start will not be skipped by linked_flag config.\n * @param override.url_trigger - optional boolean to override the default url_trigger behavior - ensures the next session recording to start will not be skipped by url_trigger config.\n * @param override.event_trigger - optional boolean to override the default event_trigger behavior - ensures the next session recording to start will not be skipped by event_trigger config.\n * @param override - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling or linked_flag config. `true` is shorthand for { sampling: true, linked_flag: true }\n */\n startSessionRecording(\n override?: { sampling?: boolean; linked_flag?: boolean; url_trigger?: true; event_trigger?: true } | true\n ): void {\n const overrideAll = override === true\n const overrideConfig: OverrideConfig = {\n sampling: overrideAll || !!override?.sampling,\n linked_flag: overrideAll || !!override?.linked_flag,\n url_trigger: overrideAll || !!override?.url_trigger,\n event_trigger: overrideAll || !!override?.event_trigger,\n }\n\n if (Object.values(overrideConfig).some(Boolean)) {\n // allow the session id check to rotate session id if necessary\n this.sessionManager?.checkAndGetSessionAndWindowId()\n\n if (overrideConfig.sampling) {\n this.sessionRecording?.overrideSampling()\n }\n\n if (overrideConfig.linked_flag) {\n this.sessionRecording?.overrideLinkedFlag()\n }\n\n if (overrideConfig.url_trigger) {\n this.sessionRecording?.overrideTrigger('url')\n }\n\n if (overrideConfig.event_trigger) {\n this.sessionRecording?.overrideTrigger('event')\n }\n }\n\n this.set_config({ disable_session_recording: false })\n }\n\n /**\n * turns session recording off, and updates the config option\n * disable_session_recording to true\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop session recording\n * posthog.stopSessionRecording()\n * ```\n */\n stopSessionRecording(): void {\n this.set_config({ disable_session_recording: true })\n }\n\n /**\n * returns a boolean indicating whether session recording\n * is currently running\n *\n * {@label Session replay}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop session recording if it's running\n * if (posthog.sessionRecordingStarted()) {\n * posthog.stopSessionRecording()\n * }\n * ```\n *\n * @returns Whether session recording is currently running.\n */\n sessionRecordingStarted(): boolean {\n return !!this.sessionRecording?.started\n }\n\n /**\n * Capture a caught exception manually\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Capture a caught exception\n * try {\n * // something that might throw\n * } catch (error) {\n * posthog.captureException(error)\n * }\n * ```\n *\n * @example\n * ```js\n * // With additional properties\n * posthog.captureException(error, {\n * customProperty: 'value',\n * anotherProperty: ['I', 'can be a list'],\n * ...\n * })\n * ```\n *\n * @param {unknown} error The error or exception-like value to capture.\n * @param {Properties} [additionalProperties] Any additional properties to add to the error event.\n * @returns The result of the capture, or undefined if exception capture is unavailable.\n */\n captureException(error: unknown, additionalProperties?: Properties): CaptureResult | undefined {\n if (!this.exceptions) return\n\n const syntheticException = new Error('PostHog syntheticException')\n const errorToProperties = this.exceptions.buildProperties(error, {\n handled: true,\n syntheticException,\n })\n return this.exceptions.sendExceptionEvent({\n ...errorToProperties,\n ...additionalProperties,\n })\n }\n\n /**\n * Add a breadcrumb-like step that will be attached to the next captured exception.\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.addExceptionStep('Checkout button clicked', {\n * checkout_id: 'ch_123',\n * })\n * ```\n *\n * @param {string} message The step message.\n * @param {Properties} [properties] Additional context for this step.\n */\n addExceptionStep(message: string, properties?: Properties): void {\n this.exceptions?.addExceptionStep(message, properties)\n }\n\n /**\n * Capture a log entry and send it to the PostHog logs endpoint.\n *\n * {@label Logs}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.captureLog({\n * body: 'checkout completed',\n * level: 'info',\n * attributes: { order_id: 'ord_789', amount_cents: 4999 },\n * })\n * ```\n *\n * @param {CaptureLogOptions} options The log entry options\n */\n captureLog(options: CaptureLogOptions): void {\n this.logs?.captureLog(options)\n }\n\n private static _noopLogger = (() => {\n const noop = () => {}\n return { trace: noop, debug: noop, info: noop, warn: noop, error: noop, fatal: noop }\n })()\n\n /**\n * Logger with convenience methods for each severity level.\n *\n * @example\n * ```js\n * posthog.logger.info('checkout completed', { order_id: 'ord_789' })\n * posthog.logger.error('payment failed', { error_code: 'E001' })\n * ```\n */\n get logger() {\n return this.logs?.logger ?? PostHog._noopLogger\n }\n\n /**\n * turns exception autocapture on, and updates the config option `capture_exceptions` to the provided config (or `true`)\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Start with default exception autocapture rules. No-op if already enabled\n * posthog.startExceptionAutocapture()\n * ```\n *\n * @example\n * ```js\n * // Start and override controls\n * posthog.startExceptionAutocapture({\n * // you don't have to send all of these (unincluded values will use the default)\n * capture_unhandled_errors: true || false,\n * capture_unhandled_rejections: true || false,\n * capture_console_errors: true || false\n * })\n * ```\n *\n * @param config - optional configuration option to control the exception autocapture behavior\n */\n startExceptionAutocapture(config?: ExceptionAutoCaptureConfig): void {\n this.set_config({ capture_exceptions: config ?? true })\n }\n\n /**\n * turns exception autocapture off by updating the config option `capture_exceptions` to `false`\n *\n * {@label Error tracking}\n *\n * @public\n *\n * @example\n * ```js\n * // Stop capturing exceptions automatically\n * posthog.stopExceptionAutocapture()\n * ```\n */\n stopExceptionAutocapture(): void {\n this.set_config({ capture_exceptions: false })\n }\n\n /**\n * returns a boolean indicating whether the [toolbar](/docs/toolbar) loaded\n *\n * {@label Toolbar}\n *\n * @public\n *\n * @param {ToolbarParams} params Toolbar parameters.\n * @returns Whether the toolbar loaded.\n */\n\n loadToolbar(params: ToolbarParams): boolean {\n return this.toolbar?.loadToolbar(params) ?? false\n }\n\n /**\n * Returns the value of a super property. Returns undefined if the property doesn't exist.\n *\n * {@label Identification}\n *\n * @remarks\n * get_property() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically.\n *\n * @example\n * ```js\n * // grab value for '$user_id' after the posthog library has loaded\n * posthog.init('<YOUR PROJECT TOKEN>', {\n * loaded: function(posthog) {\n * user_id = posthog.get_property('$user_id');\n * }\n * });\n * ```\n * @public\n *\n * @param {String} property_name The name of the super property you want to retrieve\n * @returns The stored property value, or undefined if it is not set.\n */\n get_property(property_name: string): Property | undefined {\n return this.persistence?.props[property_name]\n }\n\n /**\n * Returns the value of the session super property named property_name. If no such\n * property is set, getSessionProperty() will return the undefined value.\n *\n * {@label Identification}\n *\n * @public\n *\n * @remarks\n * This is based on browser-level `sessionStorage`, NOT the PostHog session.\n * getSessionProperty() can only be called after the PostHog library has finished loading.\n * init() has a loaded function available to handle this automatically.\n *\n * @example\n * ```js\n * // grab value for 'user_id' after the posthog library has loaded\n * posthog.init('YOUR PROJECT TOKEN', {\n * loaded: function(posthog) {\n * user_id = posthog.getSessionProperty('user_id');\n * }\n * });\n * ```\n *\n * @param {String} property_name The name of the session super property you want to retrieve\n * @returns The stored session property value, or undefined if it is not set.\n */\n getSessionProperty(property_name: string): Property | undefined {\n return this.sessionPersistence?.props[property_name]\n }\n\n /**\n * Returns a string representation of the PostHog instance.\n *\n * {@label Initialization}\n *\n * @internal\n */\n toString(): string {\n let name = this.config.name ?? PRIMARY_INSTANCE_NAME\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name\n }\n return name\n }\n\n _isIdentified(): boolean {\n return (\n this.persistence?.get_property(USER_STATE) === USER_STATE_IDENTIFIED ||\n this.sessionPersistence?.get_property(USER_STATE) === USER_STATE_IDENTIFIED\n )\n }\n\n _hasPersonProcessing(): boolean {\n return !(\n this.config.person_profiles === 'never' ||\n (this.config.person_profiles === PERSON_PROFILES_IDENTIFIED_ONLY &&\n !this._isIdentified() &&\n isEmptyObject(this.getGroups()) &&\n !this.persistence?.props?.[ALIAS_ID_KEY] &&\n !this.persistence?.props?.[ENABLE_PERSON_PROCESSING])\n )\n }\n\n _shouldCapturePageleave(): boolean {\n return (\n this.config.capture_pageleave === true ||\n (this.config.capture_pageleave === 'if_capture_pageview' &&\n (this.config.capture_pageview === true || this.config.capture_pageview === 'history_change'))\n )\n }\n\n /**\n * Creates a person profile for the current user, if they don't already have one and config.person_profiles is set\n * to 'identified_only'. Produces a warning and does not create a profile if config.person_profiles is set to\n * 'never'. Learn more about [person profiles](/docs/product-analytics/identify)\n *\n * {@label Identification}\n *\n * @public\n *\n * @example\n * ```js\n * posthog.createPersonProfile()\n * ```\n */\n createPersonProfile(): void {\n if (this._hasPersonProcessing()) {\n // if a person profile already exists, don't send an event when we don't need to\n return\n }\n if (!this._requirePersonProcessing('posthog.createPersonProfile')) {\n return\n }\n // sent a $set event. We don't set any properties here, but attribution props will be added later\n this.setPersonProperties({}, {})\n }\n\n /**\n * Marks the current user as a test user by setting the `$internal_or_test_user` person property to `true`.\n * This also enables person processing for the current user.\n *\n * This is useful for using in a cohort your internal/test filters for your posthog org.\n * @see https://posthog.com/tutorials/filter-internal-users\n * Create a cohort with `$internal_or_test_user` IS SET, and set your internal test filters to be NOT IN that cohort.\n *\n * {@label Identification}\n *\n * @example\n * ```js\n * // Manually mark as test user\n * posthog.setInternalOrTestUser()\n *\n * // Or use internal_or_test_user_hostname config for automatic detection\n * posthog.init('token', { internal_or_test_user_hostname: 'localhost' })\n * ```\n *\n * @public\n */\n setInternalOrTestUser(): void {\n if (!this._requirePersonProcessing('posthog.setInternalOrTestUser')) {\n return\n }\n this.setPersonProperties({ $internal_or_test_user: true })\n }\n\n /**\n * Enables person processing if possible, returns true if it does so or already enabled, false otherwise\n *\n * @param function_name\n */\n _requirePersonProcessing(function_name: string): boolean {\n if (this.config.person_profiles === 'never') {\n logger.error(\n function_name + ' was called, but process_person is set to \"never\". This call will be ignored.'\n )\n return false\n }\n this._register_single(ENABLE_PERSON_PROCESSING, true)\n return true\n }\n\n private _is_persistence_disabled(): boolean {\n if (this.config.cookieless_mode === 'always') {\n return true\n }\n const isOptedOut = this.consent.isOptedOut()\n const defaultPersistenceDisabled =\n this.config.opt_out_persistence_by_default || this.config.cookieless_mode === COOKIELESS_ON_REJECT\n\n // TRICKY: We want a deterministic state for persistence so that a new pageload has the same persistence\n return this.config.disable_persistence || (isOptedOut && !!defaultPersistenceDisabled)\n }\n\n private _sync_opt_out_with_persistence(): boolean {\n const persistenceDisabled = this._is_persistence_disabled()\n\n if (this.persistence?._disabled !== persistenceDisabled) {\n this.persistence?.set_disabled(persistenceDisabled)\n }\n if (this.sessionPersistence?._disabled !== persistenceDisabled) {\n this.sessionPersistence?.set_disabled(persistenceDisabled)\n }\n return persistenceDisabled\n }\n\n /**\n * Opts the user into data capturing and persistence.\n *\n * {@label Privacy}\n *\n * @remarks\n * Enables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n * By default, captures an `$opt_in` event unless disabled.\n *\n * @example\n * ```js\n * // simple opt-in\n * posthog.opt_in_capturing()\n * ```\n *\n * @example\n * ```js\n * // opt-in with custom event and properties\n * posthog.opt_in_capturing({\n * captureEventName: 'Privacy Accepted',\n * captureProperties: { source: 'banner' }\n * })\n * ```\n *\n * @example\n * ```js\n * // opt-in without capturing event\n * posthog.opt_in_capturing({\n * captureEventName: false\n * })\n * ```\n *\n * @public\n *\n * @param {Object} [options] A dictionary of opt-in options.\n * @param {EventName | null | false} [options.captureEventName] Event name to use for capturing the opt-in action. Set to `null` or `false` to skip capturing the opt-in event. Defaults to `$opt_in`.\n * @param {Properties} [options.captureProperties] Set of properties to capture along with the opt-in action.\n */\n opt_in_capturing(options?: {\n captureEventName?: EventName | null | false /** event name to be used for capturing the opt-in action */\n captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n }): void {\n if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n logger.warn(CONSENT_COOKIELESS_WARN)\n return\n }\n if (this._inCookielessMode()) {\n // If the user was being treated as rejected in on_reject mode (either explicitly opted out, or opted out by default via opt_out_capturing_by_default), then before we can start sending regular non-cookieless events\n // we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n this.reset(true)\n this.sessionManager?.destroy()\n this.pageViewManager?.destroy()\n this.sessionManager = new SessionIdManager(this)\n this.pageViewManager = new PageViewManager(this)\n if (this.persistence) {\n this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n }\n const SessionRecordingClass =\n this.config.__extensionClasses?.sessionRecording ?? PostHog.__defaultExtensionClasses?.sessionRecording\n if (SessionRecordingClass) {\n this.sessionRecording = this._replaceExtension(\n this.sessionRecording,\n new SessionRecordingClass(this) as SessionRecording\n )\n // Replay the cached remote config result so the new recorder picks up\n // server-side settings (enable flag, endpoint, sampling) that arrived while\n // we were still in cookieless mode and sessionRecording didn't yet exist.\n if (this._lastRemoteConfig) {\n this.sessionRecording?.onRemoteConfig?.(this._lastRemoteConfig)\n }\n }\n }\n\n this.consent.optInOut(true)\n this._sync_opt_out_with_persistence()\n\n // Start queue after opting in\n this._start_queue_if_opted_in()\n\n // Restart session recording if it should now be enabled\n // (this handles the case where opt_out_capturing_by_default or cookieless_mode prevented it from starting)\n this.sessionRecording?.startIfEnabledOrStop()\n\n // Reinitialize surveys if we're in cookieless mode and just opted in\n if (this.config.cookieless_mode == COOKIELESS_ON_REJECT) {\n this.surveys?.loadIfEnabled()\n }\n\n // Don't capture if captureEventName is null or false\n if (isUndefined(options?.captureEventName) || options?.captureEventName) {\n this.capture(options?.captureEventName ?? '$opt_in', options?.captureProperties, { send_instantly: true })\n }\n\n if (this.config.capture_pageview) {\n this._captureInitialPageview()\n }\n }\n\n /**\n * Opts the user out of data capturing and persistence.\n *\n * {@label Privacy}\n *\n * @remarks\n * Disables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n * If `opt_out_persistence_by_default` is true, SDK persistence will also be disabled.\n *\n * @example\n * ```js\n * // opt user out (e.g., on privacy settings page)\n * posthog.opt_out_capturing()\n * ```\n *\n * @public\n */\n opt_out_capturing(): void {\n if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n logger.warn(CONSENT_COOKIELESS_WARN)\n return\n }\n\n if (this.config.cookieless_mode === COOKIELESS_ON_REJECT && this.consent.isOptedIn()) {\n // If the user has opted in, we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n this.reset(true)\n }\n\n this.consent.optInOut(false)\n this._sync_opt_out_with_persistence()\n\n if (this.config.cookieless_mode === COOKIELESS_ON_REJECT) {\n // If cookieless_mode is COOKIELESS_ON_REJECT, we start capturing events in cookieless mode\n this.register({\n distinct_id: COOKIELESS_SENTINEL_VALUE,\n $device_id: null,\n })\n // tear down rrweb observers before sessionManager goes away — late events would throw\n this.sessionRecording?.stopRecording()\n this.sessionRecording = undefined\n this.sessionManager?.destroy()\n this.pageViewManager?.destroy()\n this.sessionManager = undefined\n this.sessionPropsManager = undefined\n if (this.config.capture_pageview) {\n this._captureInitialPageview()\n }\n // At init time, consent was PENDING so is_capturing() was false and _start_queue_if_opted_in() was a no-op.\n // Now that rejection has been recorded, capturing is active — enable the queue so batched events are flushed.\n this._start_queue_if_opted_in()\n }\n }\n\n /**\n * Checks if the user has opted into data capturing.\n *\n * {@label Privacy}\n *\n * @remarks\n * Returns the current consent status for event tracking and data persistence.\n *\n * @example\n * ```js\n * if (posthog.has_opted_in_capturing()) {\n * // show analytics features\n * }\n * ```\n *\n * @public\n *\n * @returns {boolean} current opt-in status\n */\n has_opted_in_capturing(): boolean {\n return this.consent.isOptedIn()\n }\n\n /**\n * Checks if the user has opted out of data capturing.\n *\n * {@label Privacy}\n *\n * @remarks\n * Returns the current consent status for event tracking and data persistence.\n *\n * @example\n * ```js\n * if (posthog.has_opted_out_capturing()) {\n * // disable analytics features\n * }\n * ```\n *\n * @public\n *\n * @returns {boolean} current opt-out status\n */\n has_opted_out_capturing(): boolean {\n return this.consent.isOptedOut()\n }\n\n /**\n * Returns the explicit consent status of the user.\n *\n * @remarks\n * This can be used to check if the user has explicitly opted in or out of data capturing, or neither. This does not\n * take the default config options into account, only whether the user has made an explicit choice, so this can be\n * used to determine whether to show an initial cookie banner or not.\n *\n * @example\n * ```js\n * const consentStatus = posthog.get_explicit_consent_status()\n * if (consentStatus === \"granted\") {\n * // user has explicitly opted in\n * } else if (consentStatus === \"denied\") {\n * // user has explicitly opted out\n * } else if (consentStatus === \"pending\"){\n * // user has not made a choice, show consent banner\n * }\n * ```\n *\n * @public\n *\n * @returns The current explicit consent status.\n */\n get_explicit_consent_status(): 'granted' | 'denied' | 'pending' {\n const consent = this.consent.consent\n return consent === ConsentStatus.GRANTED ? 'granted' : consent === ConsentStatus.DENIED ? 'denied' : 'pending'\n }\n\n /**\n * Checks whether the PostHog library is currently capturing events.\n *\n * Usually this means that the user has not opted out of capturing, but the exact behaviour can be controlled by\n * some config options.\n *\n * Additionally, if the cookieless_mode is set to `'on_reject'`, we will capture events in cookieless mode if the\n * user has opted out or been defaulted to opt-out.\n *\n * {@label Privacy}\n *\n * @see {PostHogConfig.cookieless_mode}\n * @see {PostHogConfig.opt_out_persistence_by_default}\n * @see {PostHogConfig.respect_dnt}\n *\n * @returns {boolean} whether the posthog library is capturing events\n */\n is_capturing(): boolean {\n if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n return true\n }\n if (this.config.cookieless_mode === COOKIELESS_ON_REJECT) {\n return this.consent.isRejected() || this.consent.isOptedIn()\n } else {\n return !this.has_opted_out_capturing()\n }\n }\n\n /**\n * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n *\n * {@label Privacy}\n *\n * @public\n *\n */\n clear_opt_in_out_capturing(): void {\n this.consent.reset()\n this._sync_opt_out_with_persistence()\n }\n\n _is_bot(): boolean | undefined {\n if (navigator) {\n return isLikelyBot(navigator, this.config.custom_blocked_useragents)\n } else {\n return undefined\n }\n }\n\n _captureInitialPageview(): void {\n if (!document) {\n return\n }\n\n // If page is not visible, add a listener to detect when the page becomes visible\n // and trigger the pageview only then\n // This is useful to avoid `prerender` calls from Chrome/Wordpress/SPAs\n // that are not visible to the user\n\n if (document.visibilityState !== 'visible') {\n if (!this._visibilityStateListener) {\n this._visibilityStateListener = this._captureInitialPageview.bind(this)\n addEventListener(document, DOM_EVENT_VISIBILITYCHANGE, this._visibilityStateListener)\n }\n\n return\n }\n\n // Extra check here to guarantee we only ever trigger a single `$pageview` event\n if (!this._initialPageviewCaptured) {\n this._initialPageviewCaptured = true\n this.capture(EVENT_PAGEVIEW, { title: document.title }, { send_instantly: true })\n\n // After we've captured the initial pageview, we can remove the listener\n if (this._visibilityStateListener) {\n document.removeEventListener(DOM_EVENT_VISIBILITYCHANGE, this._visibilityStateListener)\n this._visibilityStateListener = null\n }\n }\n }\n\n /**\n * Enables or disables debug mode for detailed logging.\n *\n * @remarks\n * Debug mode logs all PostHog calls to the browser console for troubleshooting.\n * Can also be enabled by adding `?__posthog_debug=true` to the URL.\n *\n * {@label Initialization}\n *\n * @example\n * ```js\n * // enable debug mode\n * posthog.debug(true)\n * ```\n *\n * @example\n * ```js\n * // disable debug mode\n * posthog.debug(false)\n * ```\n *\n * @public\n *\n * @param {boolean} [debug] If true, will enable debug mode.\n */\n debug(debug?: boolean): void {\n if (debug === false) {\n window?.console.log(\"You've disabled debug mode.\")\n this.set_config({ debug: false })\n } else {\n window?.console.log(\n \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n )\n this.set_config({ debug: true })\n }\n }\n\n /**\n * Helper method to check if external API calls (flags/decide) should be disabled\n * Handles migration from old `advanced_disable_decide` to new `advanced_disable_flags`\n */\n _shouldDisableFlags(): boolean {\n // Check if advanced_disable_flags was explicitly set in original config\n const originalConfig = this._originalUserConfig || {}\n if ('advanced_disable_flags' in originalConfig) {\n return !!originalConfig.advanced_disable_flags\n }\n\n // Check if advanced_disable_flags was set post-init (different from default false)\n if (this.config.advanced_disable_flags !== false) {\n return !!this.config.advanced_disable_flags\n }\n\n // Check for post-init changes to advanced_disable_decide\n if (this.config.advanced_disable_decide === true) {\n logger.warn(\n \"Config field 'advanced_disable_decide' is deprecated. Please use 'advanced_disable_flags' instead. \" +\n 'The old field will be removed in a future major version.'\n )\n return true\n }\n\n // Fall back to migration logic for original user config\n return migrateConfigField(originalConfig, 'advanced_disable_flags', 'advanced_disable_decide', false, logger)\n }\n\n private _runBeforeSend(data: CaptureResult): CaptureResult | null {\n if (isNullish(this.config.before_send)) {\n return data\n }\n\n // Some properties are required for the event to be ingested - e.g. `token`\n // carries the project api_key, and ingest rejects any event that arrives\n // without it (a 401). Snapshot which of these were present before the hooks\n // run, so we can tell if a hook removed one (the names are captured here, so\n // a hook that mutates `data.properties` in place can't hide the removal).\n const requiredProperties = Object.keys(data.properties ?? {}).filter(isKnownUnsafeEditableEventProperty)\n\n const fns = isArray(this.config.before_send) ? this.config.before_send : [this.config.before_send]\n let beforeSendResult: CaptureResult | null = data\n for (const fn of fns) {\n beforeSendResult = fn(beforeSendResult)\n if (isNullish(beforeSendResult)) {\n const logMessage = `Event '${data.event}' was rejected in beforeSend function`\n if (isKnownUnsafeEditableEvent(data.event)) {\n logger.warn(`${logMessage}. This can cause unexpected behavior.`)\n } else {\n logger.info(logMessage)\n }\n return null\n }\n if (!beforeSendResult.properties || isEmptyObject(beforeSendResult.properties)) {\n logger.warn(\n `Event '${data.event}' has no properties after beforeSend function, this is likely an error.`\n )\n }\n }\n // If a beforeSend hook removed a property the event needs to be ingested\n // (e.g. a generic token/PII scrubber matching /token/i dropping `token`),\n // ingest would silently reject every such event with a 401. Drop the event\n // here and warn instead - we don't restore the property, since the removal\n // may have been intentional.\n for (const property of requiredProperties) {\n if (beforeSendResult.properties && isNullish(beforeSendResult.properties[property])) {\n logger.warn(\n `Event '${data.event}' had its '${property}' property removed in a beforeSend function. This property is required for ingestion, so the event will be dropped.`\n )\n return null\n }\n }\n return beforeSendResult\n }\n\n /**\n * Returns the current page view ID.\n *\n * {@label Initialization}\n *\n * @public\n *\n * @returns The current page view ID, or undefined if no page view has been captured.\n */\n public getPageViewId(): string | undefined {\n return this.pageViewManager._currentPageview?.pageViewId\n }\n\n /**\n * Capture written user feedback for a LLM trace. Numeric values are converted to strings.\n *\n * {@label LLM analytics}\n *\n * @public\n *\n * @param traceId The trace ID to capture feedback for.\n * @param userFeedback The feedback to capture.\n */\n captureTraceFeedback(traceId: string | number, userFeedback: string) {\n this.capture('$ai_feedback', {\n $ai_trace_id: String(traceId),\n $ai_feedback_text: userFeedback,\n })\n }\n\n /**\n * Capture a metric for a LLM trace. Numeric values are converted to strings.\n *\n * {@label LLM analytics}\n *\n * @public\n *\n * @param traceId The trace ID to capture the metric for.\n * @param metricName The name of the metric to capture.\n * @param metricValue The value of the metric to capture.\n */\n captureTraceMetric(traceId: string | number, metricName: string, metricValue: string | number | boolean) {\n this.capture('$ai_metric', {\n $ai_trace_id: String(traceId),\n $ai_metric_name: metricName,\n $ai_metric_value: String(metricValue),\n })\n }\n\n private _checkLocalStorageForDebug(debugConfig: boolean | undefined) {\n const explicitlyFalse = isBoolean(debugConfig) && !debugConfig\n const isTrueInLocalStorage = localStore._is_supported() && localStore._get('ph_debug') === 'true'\n return explicitlyFalse ? false : isTrueInLocalStorage ? true : debugConfig\n }\n}\n\nsafewrapClass(PostHog, ['identify'])\n\nconst add_dom_loaded_handler = function () {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if ((dom_loaded_handler as any).done) {\n return\n }\n ;(dom_loaded_handler as any).done = true\n\n ENQUEUE_REQUESTS = false\n\n each(instances, function (inst: PostHog) {\n inst._dom_loaded()\n })\n }\n\n if (document?.addEventListener) {\n if (document.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler()\n } else {\n addEventListener(document, 'DOMContentLoaded', dom_loaded_handler, { capture: false })\n }\n\n return\n }\n\n // Only IE6-8 don't support `document.addEventListener` and we don't support them\n // so let's simply log an error stating PostHog couldn't be initialized\n // We're checking for `window` to avoid erroring out on a SSR context\n if (window) {\n logger.error(\"Browser doesn't support `document.addEventListener` so PostHog couldn't be initialized\")\n }\n}\n\nexport function init_from_snippet(): void {\n Config.SDK_DIST_CHANNEL = 'cdn'\n const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n const snippetPostHog = assignableWindow['posthog']\n\n if (snippetPostHog) {\n /**\n * The snippet uses some clever tricks to allow deferred loading of array.js (this code)\n *\n * window.posthog is an array which the queue of calls made before the lib is loaded\n * It has methods attached to it to simulate the posthog object so for instance\n *\n * window.posthog.init(\"TOKEN\", {api_host: \"foo\" })\n * window.posthog.capture(\"my-event\", {foo: \"bar\" })\n *\n * ... will mean that window.posthog will look like this:\n * window.posthog == [\n * [\"my-event\", {foo: \"bar\"}]\n * ]\n *\n * window.posthog[_i] == [\n * [\"TOKEN\", {api_host: \"foo\" }, \"posthog\"]\n * ]\n *\n * If a name is given to the init function then the same as above is true but as a sub-property on the object:\n *\n * window.posthog.init(\"TOKEN\", {}, \"ph2\")\n * window.posthog.ph2.people.set({foo: \"bar\"})\n *\n * window.posthog.ph2 == []\n * window.posthog.people == [\n * [\"set\", {foo: \"bar\"}]\n * ]\n *\n */\n\n // Call all pre-loaded init calls properly\n\n each(snippetPostHog['_i'], function (item: [token: string, config: Partial<PostHogConfig>, name: string]) {\n if (item && isArray(item)) {\n const instance = posthogMain.init(item[0], item[1], item[2])\n\n const instanceSnippet = snippetPostHog[item[2]] || snippetPostHog\n\n if (instance) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance.people, instanceSnippet.people)\n instance._execute_array(instanceSnippet)\n }\n }\n })\n }\n\n assignableWindow['posthog'] = posthogMain\n\n add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n Config.SDK_DIST_CHANNEL = 'npm'\n const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n add_dom_loaded_handler()\n\n return posthogMain\n}\n","import { isArray, isNullish, isUndefined } from \"../utils/index.mjs\";\nconst SURVEY_LANGUAGE_PROPERTY = '$survey_language';\nfunction getSurveyResponseKey(questionId) {\n return `$survey_response_${questionId}`;\n}\nfunction getSurveyOldResponseKey(originalQuestionIndex) {\n return 0 === originalQuestionIndex ? '$survey_response' : `$survey_response_${originalQuestionIndex}`;\n}\nfunction getSurveyResponseValue(responses, questionId) {\n if (!questionId) return null;\n const response = responses[getSurveyResponseKey(questionId)];\n if (isArray(response)) return [\n ...response\n ];\n return response;\n}\nfunction buildSurveyResponseProperties(responses = {}, survey) {\n const oldFormatResponses = {};\n survey.questions.forEach((question)=>{\n if (isUndefined(question.originalQuestionIndex)) return;\n const oldResponseKey = getSurveyOldResponseKey(question.originalQuestionIndex);\n const response = getSurveyResponseValue(responses, question.id);\n if (!isUndefined(response)) oldFormatResponses[oldResponseKey] = response;\n });\n return {\n $survey_questions: survey.questions.map((question)=>({\n id: question.id,\n question: question.question,\n response: getSurveyResponseValue(responses, question.id)\n })),\n ...responses,\n ...oldFormatResponses\n };\n}\nfunction surveyHasResponses(responses = {}) {\n return Object.values(responses).some((response)=>!isNullish(response));\n}\nfunction getSurveyInteractionProperty(survey, action) {\n let surveyProperty = `$survey_${action}/${survey.id}`;\n if (survey.current_iteration && survey.current_iteration > 0) surveyProperty = `$survey_${action}/${survey.id}/${survey.current_iteration}`;\n return surveyProperty;\n}\nexport { SURVEY_LANGUAGE_PROPERTY, buildSurveyResponseProperties, getSurveyInteractionProperty, getSurveyOldResponseKey, getSurveyResponseKey, getSurveyResponseValue, surveyHasResponses };\n","// Naive rage click implementation: If mouse has not moved further than thresholdPx\n// over clickCount clicks with max timeoutMs between clicks, it's\n// counted as a rage click\n\nimport { isObject } from '@posthog/core'\nimport { RageclickConfig } from '../types'\n\nconst DEFAULT_THRESHOLD_PX = 30\nconst DEFAULT_TIMEOUT_MS = 1000\nconst DEFAULT_CLICK_COUNT = 3\n\nexport default class RageClick {\n clicks: { x: number; y: number; timestamp: number }[]\n\n thresholdPx: number\n timeoutMs: number\n clickCount: number\n disabled: boolean\n\n constructor(rageclickConfig: RageclickConfig | boolean) {\n this.disabled = rageclickConfig === false\n const conf = isObject(rageclickConfig) ? rageclickConfig : {}\n\n this.thresholdPx = conf.threshold_px || DEFAULT_THRESHOLD_PX\n this.timeoutMs = conf.timeout_ms || DEFAULT_TIMEOUT_MS\n this.clickCount = conf.click_count || DEFAULT_CLICK_COUNT\n\n this.clicks = []\n }\n\n isRageClick(x: number, y: number, timestamp: number): boolean {\n if (this.disabled) {\n return false\n }\n\n const lastClick = this.clicks[this.clicks.length - 1]\n if (\n lastClick &&\n Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < this.thresholdPx &&\n timestamp - lastClick.timestamp < this.timeoutMs\n ) {\n this.clicks.push({ x, y, timestamp })\n\n if (this.clicks.length === this.clickCount) {\n return true\n }\n } else {\n this.clicks = [{ x, y, timestamp }]\n }\n\n return false\n }\n}\n","import { addEventListener, each, extend } from '@posthog/browser-common/utils/general-utils'\nimport {\n autocaptureCompatibleElements,\n getClassNames,\n getDirectAndNestedSpanText,\n getElementsChainString,\n getEventTarget,\n getSafeText,\n isAngularStyleAttr,\n isSensitiveElement,\n makeSafeText,\n MAX_DOM_ANCESTOR_DEPTH,\n shouldCaptureDomEvent,\n shouldCaptureElement,\n shouldCaptureRageclick,\n shouldCaptureValue,\n splitClassString,\n} from '@posthog/browser-common/utils/autocapture-utils'\n\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, EventName, Properties, RemoteConfigResult } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nimport { isBoolean, isFunction, isNull, isObject, stripUrlHash } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { document, window } from '@posthog/browser-common/utils/globals'\nimport { convertToURL } from '@posthog/browser-common/utils/request-utils'\nimport { isElementNode, isShadowRoot, isTag, isTextNode } from '@posthog/browser-common/utils/element-utils'\nimport { includes } from '@posthog/core'\nimport type { Extension } from './extensions/types'\n\nconst COPY_AUTOCAPTURE_EVENT = '$copy_autocapture'\n\nconst logger = createLogger('[AutoCapture]')\n\nfunction limitText(length: number, text: string): string {\n if (text.length > length) {\n return text.slice(0, length) + '...'\n }\n return text\n}\n\nexport function getAugmentPropertiesFromElement(elem: Element): Properties {\n const shouldCaptureEl = shouldCaptureElement(elem)\n if (!shouldCaptureEl) {\n return {}\n }\n\n const props: Properties = {}\n\n each(elem.attributes, function (attr: Attr) {\n if (attr.name && attr.name.indexOf('data-ph-capture-attribute') === 0) {\n const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n const propertyValue = attr.value\n if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n props[propertyKey] = propertyValue\n }\n }\n })\n\n return props\n}\n\nexport function previousElementSibling(el: Element): Element | null {\n if (el.previousElementSibling) {\n return el.previousElementSibling\n }\n let _el: Element | null = el\n do {\n _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n } while (_el && !isElementNode(_el))\n return _el\n}\n\nexport function getDefaultProperties(eventType: string): Properties {\n return {\n $event_type: eventType,\n $ce_version: 1,\n }\n}\n\nexport function getPropertiesFromElement(\n elem: Element,\n maskAllAttributes: boolean,\n maskText: boolean,\n elementAttributeIgnorelist: string[] | undefined,\n disableCaptureUrlHashes: boolean = false\n): Properties {\n const tag_name = elem.tagName.toLowerCase()\n const props: Properties = {\n tag_name: tag_name,\n }\n if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n } else {\n props['$el_text'] = limitText(1024, getSafeText(elem))\n }\n }\n\n const classes = getClassNames(elem)\n if (classes.length > 0)\n props['classes'] = classes.filter(function (c) {\n return c !== ''\n })\n\n // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n each(elem.attributes, function (attr: Attr) {\n // Only capture attributes we know are safe\n if (isSensitiveElement(elem) && ['name', 'id', 'class', 'aria-label'].indexOf(attr.name) === -1) return\n\n if (elementAttributeIgnorelist?.includes(attr.name)) return\n\n if (!maskAllAttributes && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n let value = attr.value\n if (attr.name === 'class') {\n // html attributes can _technically_ contain linebreaks,\n // but we're very intolerant of them in the class string,\n // so we strip them.\n value = splitClassString(value).join(' ')\n }\n props['attr__' + attr.name] = limitText(\n 1024,\n attr.name === 'href' && disableCaptureUrlHashes ? stripUrlHash(value) : value\n )\n }\n })\n\n let nthChild = 1\n let nthOfType = 1\n let currentElem: Element | null = elem\n while ((currentElem = previousElementSibling(currentElem))) {\n nthChild++\n if (currentElem.tagName === elem.tagName) {\n nthOfType++\n }\n }\n props['nth_child'] = nthChild\n props['nth_of_type'] = nthOfType\n\n return props\n}\n\nexport function autocapturePropertiesForElement(\n target: Element,\n {\n e,\n maskAllElementAttributes,\n maskAllText,\n elementAttributeIgnoreList,\n elementsChainAsString,\n disableCaptureUrlHashes,\n }: {\n e: Event\n maskAllElementAttributes: boolean\n maskAllText: boolean\n elementAttributeIgnoreList?: string[] | undefined\n elementsChainAsString: boolean\n disableCaptureUrlHashes: boolean\n }\n): { props: Properties; explicitNoCapture?: boolean } {\n if (!isElementNode(target)) {\n return { props: {} }\n }\n\n const targetElementList: Element[] = [target]\n const seen = new Set<Node>([target])\n let curEl: Element = target\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n // bail out of abnormally deep or cyclic (patched parentNode) ancestor chains\n if (targetElementList.length >= MAX_DOM_ANCESTOR_DEPTH) {\n break\n }\n if (isShadowRoot(curEl.parentNode)) {\n const host = curEl.parentNode.host\n if (seen.has(host)) {\n break\n }\n seen.add(host)\n targetElementList.push(host)\n curEl = host\n continue\n }\n if (!isElementNode(curEl.parentNode)) {\n break\n }\n if (seen.has(curEl.parentNode)) {\n break\n }\n seen.add(curEl.parentNode)\n targetElementList.push(curEl.parentNode)\n curEl = curEl.parentNode\n }\n\n const elementsJson: Properties[] = []\n const autocaptureAugmentProperties: Properties = {}\n let href: string | false = false\n let explicitNoCapture = false\n\n each(targetElementList, (el) => {\n const shouldCaptureEl = shouldCaptureElement(el)\n\n // if the element or a parent element is an anchor tag\n // include the href as a property\n if (isTag(el, 'a')) {\n const hrefAttr = el.getAttribute('href')\n href =\n shouldCaptureEl && !!hrefAttr && shouldCaptureValue(hrefAttr)\n ? disableCaptureUrlHashes\n ? stripUrlHash(hrefAttr)\n : hrefAttr\n : false\n }\n\n // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n const classes = getClassNames(el)\n if (includes(classes, 'ph-no-capture')) {\n explicitNoCapture = true\n }\n\n elementsJson.push(\n getPropertiesFromElement(\n el,\n maskAllElementAttributes,\n maskAllText,\n elementAttributeIgnoreList,\n disableCaptureUrlHashes\n )\n )\n\n const augmentProperties = getAugmentPropertiesFromElement(el)\n extend(autocaptureAugmentProperties, augmentProperties)\n })\n\n if (explicitNoCapture) {\n return { props: {}, explicitNoCapture }\n }\n\n if (!maskAllText) {\n // if the element is a button or anchor tag get the span text from any\n // children and include it as/with the text property on the parent element\n if (isTag(target, 'a') || isTag(target, 'button')) {\n elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n } else {\n elementsJson[0]['$el_text'] = getSafeText(target)\n }\n }\n\n let externalHref: string | undefined\n if (href) {\n elementsJson[0]['attr__href'] = href\n const hrefHost = convertToURL(href)?.host\n const locationHost = window?.location?.host\n if (hrefHost && locationHost && hrefHost !== locationHost) {\n externalHref = href\n }\n }\n\n const props = extend(\n getDefaultProperties(e.type),\n // Sending \"$elements\" is deprecated. Only one client on US cloud uses this.\n !elementsChainAsString ? { $elements: elementsJson } : {},\n // Always send $elements_chain, as it's needed downstream in site app filtering\n { $elements_chain: getElementsChainString(elementsJson) },\n elementsJson[0]?.['$el_text'] ? { $el_text: elementsJson[0]?.['$el_text'] } : {},\n externalHref && e.type === 'click' ? { $external_click_url: externalHref } : {},\n autocaptureAugmentProperties\n )\n\n return { props }\n}\n\nexport class Autocapture implements Extension {\n instance: PostHog\n _initialized: boolean = false\n _isDisabledServerSide: boolean | null = null\n _hasReceivedConfigResponse: boolean = false\n _elementSelectors: Set<string> | null\n rageclicks: RageClick\n _elementsChainAsString = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.rageclicks = new RageClick(instance.config.rageclick)\n this._elementSelectors = null\n }\n\n initialize() {\n this.startIfEnabled()\n }\n\n private get _config(): AutocaptureConfig {\n const config = isObject(this.instance.config.autocapture) ? this.instance.config.autocapture : {}\n // precompile the regex\n config.url_allowlist = config.url_allowlist?.map((url) => new RegExp(url))\n config.url_ignorelist = config.url_ignorelist?.map((url) => new RegExp(url))\n return config\n }\n\n _addDomEventHandlers(): void {\n if (!this.isBrowserSupported()) {\n logger.info('Disabling Automatic Event Collection because this browser is not supported')\n return\n }\n\n if (!window || !document) {\n return\n }\n\n const handler = (e: Event) => {\n e = e || window?.event\n try {\n this._captureEvent(e)\n } catch (error) {\n logger.error('Failed to capture event', error)\n }\n }\n\n addEventListener(document, 'submit', handler, { capture: true })\n addEventListener(document, 'change', handler, { capture: true })\n addEventListener(document, 'click', handler, { capture: true })\n\n if (this._config.capture_copied_text) {\n const copiedTextHandler = (e: Event) => {\n e = e || window?.event\n try {\n this._captureEvent(e, COPY_AUTOCAPTURE_EVENT)\n } catch (error) {\n logger.error('Failed to capture copy/cut event', error)\n }\n }\n\n addEventListener(document, 'copy', copiedTextHandler, { capture: true })\n addEventListener(document, 'cut', copiedTextHandler, { capture: true })\n }\n }\n\n public startIfEnabled() {\n if (this.isEnabled && !this._initialized) {\n this._addDomEventHandlers()\n this._initialized = true\n }\n }\n\n public onRemoteConfig(result: RemoteConfigResult) {\n this._hasReceivedConfigResponse = true\n if (!result.ok) {\n // Failed fetch = opt-out unknown: keep the last known persisted server\n // value instead of defaulting to enabled, so a network error cannot turn\n // autocapture on for an opted-out project. No persistence write.\n this.startIfEnabled()\n return\n }\n\n const response = result.config\n if (response.elementsChainAsString) {\n this._elementsChainAsString = response.elementsChainAsString\n }\n\n // A missing autocapture_opt_out carries no opt-out information:\n // keep the last known server value, as with a failed fetch.\n const optOut = response['autocapture_opt_out']\n if (isBoolean(optOut)) {\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [AUTOCAPTURE_DISABLED_SERVER_SIDE]: optOut,\n })\n }\n // store this in-memory in case persistence is disabled\n this._isDisabledServerSide = optOut\n }\n this.startIfEnabled()\n }\n\n public setElementSelectors(selectors: Set<string>): void {\n this._elementSelectors = selectors\n }\n\n public getElementSelectors(element: Element | null): string[] | null {\n const elementSelectors: string[] = []\n\n this._elementSelectors?.forEach((selector) => {\n const matchedElements = document?.querySelectorAll(selector)\n matchedElements?.forEach((matchedElement: Element) => {\n if (element === matchedElement) {\n elementSelectors.push(selector)\n }\n })\n })\n\n return elementSelectors\n }\n\n public get isEnabled(): boolean {\n const persistedServerDisabled = this.instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n const memoryDisabled = this._isDisabledServerSide\n\n // The /flags-disabled bypass only applies while no config outcome has arrived;\n // once a response (or failure) has been seen, an unknown opt-out stays off.\n const clientConfigOnly = this.instance._shouldDisableFlags() && !this._hasReceivedConfigResponse\n if (isNull(memoryDisabled) && !isBoolean(persistedServerDisabled) && !clientConfigOnly) {\n // We only enable if we know that the server has not disabled it\n return false\n }\n\n const disabledServer = this._isDisabledServerSide ?? !!persistedServerDisabled\n const disabledClient = !this.instance.config.autocapture\n return !disabledClient && !disabledServer\n }\n\n private _captureEvent(e: Event, eventName: EventName = '$autocapture'): boolean | void {\n if (!this.isEnabled) {\n return\n }\n\n /*** Don't mess with this code without running IE8 tests on it ***/\n let target = getEventTarget(e)\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = (target.parentNode || null) as Element | null\n }\n\n if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n if (\n !!this.instance.config.rageclick &&\n this.rageclicks?.isRageClick(e.clientX, e.clientY, e.timeStamp || new Date().getTime())\n ) {\n if (shouldCaptureRageclick(target, this.instance.config.rageclick)) {\n this._captureEvent(e, '$rageclick')\n }\n }\n }\n\n const isCopyAutocapture = eventName === COPY_AUTOCAPTURE_EVENT\n if (\n target &&\n shouldCaptureDomEvent(\n target,\n e,\n this._config,\n // mostly this method cares about the target element, but in the case of copy events,\n // we want some of the work this check does without insisting on the target element's type\n isCopyAutocapture,\n // we also don't want to restrict copy checks to clicks,\n // so we pass that knowledge in here, rather than add the logic inside the check\n isCopyAutocapture ? ['copy', 'cut'] : undefined,\n this.instance\n )\n ) {\n const { props, explicitNoCapture } = autocapturePropertiesForElement(target, {\n e,\n maskAllElementAttributes: this.instance.config.mask_all_element_attributes,\n maskAllText: this.instance.config.mask_all_text,\n elementAttributeIgnoreList: this._config.element_attribute_ignorelist,\n elementsChainAsString: this._elementsChainAsString,\n disableCaptureUrlHashes: this.instance.config.disable_capture_url_hashes,\n })\n\n if (explicitNoCapture) {\n return false\n }\n\n const elementSelectors = this.getElementSelectors(target)\n if (elementSelectors && elementSelectors.length > 0) {\n props['$element_selectors'] = elementSelectors\n }\n\n if (eventName === COPY_AUTOCAPTURE_EVENT) {\n // you can't read the data from the clipboard event,\n // but you can guess that you can read it from the window's current selection\n const selectedContent = makeSafeText(window?.getSelection()?.toString())\n const clipType = (e as ClipboardEvent).type || 'clipboard'\n if (!selectedContent) {\n return false\n }\n props['$selected_content'] = selectedContent\n props['$copy_type'] = clipType\n }\n\n this.instance.capture(eventName, props)\n return true\n }\n }\n\n isBrowserSupported(): boolean {\n return isFunction(document?.querySelectorAll)\n }\n}\n","import { window } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from '../../utils/globals'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfigResult } from '../../types'\n\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE } from '../../constants'\nimport { isUndefined, BucketedRateLimiter, isObject, resolveExceptionRateLimiterConfig } from '@posthog/core'\nimport { ErrorTracking } from '@posthog/core'\nimport { ExceptionAutoCaptureConfig } from '../../types'\n\nconst logger = createLogger('[ExceptionAutocapture]')\n\nexport class ExceptionObserver {\n private _instance: PostHog\n private _rateLimiter: BucketedRateLimiter<string>\n private _remoteEnabled: boolean | undefined\n private _config: Required<ExceptionAutoCaptureConfig>\n private _unwrapOnError: (() => void) | undefined\n private _unwrapUnhandledRejection: (() => void) | undefined\n private _unwrapConsoleError: (() => void) | undefined\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._remoteEnabled = !!this._instance.persistence?.props[EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]\n\n // Burst protection is scoped per exception type: captures ten exceptions before rate\n // limiting, then refills at a rate of one token / 10 second period (e.g. captures 1\n // rate-limited exception of that type every 10 seconds until the burst ends). The bucket\n // size and refill rate can be tuned via the `exceptionRateLimiterBucketSize` and\n // `exceptionRateLimiterRefillRate` config options.\n this._rateLimiter = new BucketedRateLimiter({\n ...resolveExceptionRateLimiterConfig(this._instance.config.error_tracking),\n refillInterval: 10000, // ten seconds in milliseconds,\n _logger: logger,\n })\n\n this._config = this._requiredConfig()\n this.startIfEnabledOrStop()\n }\n\n private _requiredConfig(): Required<ExceptionAutoCaptureConfig> {\n const providedConfig = this._instance.config.capture_exceptions\n let config: Required<ExceptionAutoCaptureConfig> = {\n capture_unhandled_errors: false,\n capture_unhandled_rejections: false,\n capture_console_errors: false,\n }\n\n if (isObject(providedConfig)) {\n config = { ...config, ...providedConfig }\n } else if (isUndefined(providedConfig) ? this._remoteEnabled : providedConfig) {\n config = { ...config, capture_unhandled_errors: true, capture_unhandled_rejections: true }\n }\n\n return config\n }\n\n public get isEnabled(): boolean {\n return (\n this._config.capture_console_errors ||\n this._config.capture_unhandled_errors ||\n this._config.capture_unhandled_rejections\n )\n }\n\n startIfEnabledOrStop(): void {\n if (this.isEnabled) {\n logger.info('enabled')\n this._stopCapturing()\n this._loadScript(this._startCapturing)\n } else {\n this._stopCapturing()\n }\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n // already loaded\n cb()\n return\n }\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n 'exception-autocapture',\n (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n }\n )\n }\n\n private _startCapturing = () => {\n if (!window || !this.isEnabled || !assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n return\n }\n\n const wrapOnError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapOnError\n const wrapUnhandledRejection =\n assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapUnhandledRejection\n const wrapConsoleError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapConsoleError\n\n try {\n if (!this._unwrapOnError && this._config.capture_unhandled_errors) {\n this._unwrapOnError = wrapOnError(this.captureException.bind(this))\n }\n if (!this._unwrapUnhandledRejection && this._config.capture_unhandled_rejections) {\n this._unwrapUnhandledRejection = wrapUnhandledRejection(this.captureException.bind(this))\n }\n if (!this._unwrapConsoleError && this._config.capture_console_errors) {\n this._unwrapConsoleError = wrapConsoleError(this.captureException.bind(this))\n }\n } catch (e) {\n logger.error('failed to start', e)\n this._stopCapturing()\n }\n }\n\n private _stopCapturing() {\n this._unwrapOnError?.()\n this._unwrapOnError = undefined\n\n this._unwrapUnhandledRejection?.()\n this._unwrapUnhandledRejection = undefined\n\n this._unwrapConsoleError?.()\n this._unwrapConsoleError = undefined\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without an autocaptureExceptions key.\n return\n }\n\n const response = result.config\n if (!('autocaptureExceptions' in response)) {\n return\n }\n\n const autocaptureExceptionsResponse = response.autocaptureExceptions\n\n // store this in-memory in case persistence is disabled\n this._remoteEnabled = !!autocaptureExceptionsResponse || false\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]: this._remoteEnabled,\n })\n }\n\n this._config = this._requiredConfig()\n this.startIfEnabledOrStop()\n }\n\n onConfigChange() {\n this._config = this._requiredConfig()\n }\n\n captureException(errorProperties: ErrorTracking.ErrorProperties) {\n const exceptionType = errorProperties?.$exception_list?.[0]?.type ?? 'Exception'\n const isRateLimited = this._rateLimiter.consumeRateLimit(exceptionType)\n\n if (isRateLimited) {\n logger.info('Skipping exception capture because of client rate limiting.', {\n exception: exceptionType,\n })\n return\n }\n\n this._instance.exceptions?.sendExceptionEvent(errorProperties)\n }\n}\n","// Portions of this file are derived from getsentry/sentry-javascript\n// Copyright (c) 2012 Functional Software, Inc. dba Sentry\n// Licensed under the MIT License: https://github.com/getsentry/sentry-javascript/blob/develop/LICENSE\n\n// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\nimport { isFunction } from '@posthog/core'\n\n// Each call to `patch` installs a \"layer\" in the wrapper chain. A wrapper calls\n// down through its layer's mutable `next` reference rather than closing over the\n// original directly, so that any layer can later be spliced out of the chain —\n// even when newer wrappers sit on top of it.\n//\n// Without this, restoring a patch only worked when it was still on top of the\n// chain (`source[name] === wrapped`). posthog-js wraps `window.fetch` in two\n// independent places (tracing headers and session-recording network capture),\n// so restores routinely ran out of order and silently no-op'd. Each leaked\n// wrapper stayed in the call path, and repeated start/stop cycles grew the chain\n// without bound until a real fetch walked a chain deep enough to overflow the\n// call stack (\"Maximum call stack size exceeded\" from recursive `window.fetch`).\ninterface PatchLayer {\n next: (...args: any[]) => any\n}\n\nconst noop = () => {\n //\n}\n\nexport function patch(\n source: { [key: string]: any },\n name: string,\n replacement: (...args: unknown[]) => unknown\n): () => void {\n try {\n if (!(name in source)) {\n return noop\n }\n\n const original = source[name] as (...args: any[]) => any\n\n const layer: PatchLayer = {\n next: original,\n }\n\n // The wrapper receives this stable delegate instead of `original`, so the\n // function it actually calls can be re-pointed when a lower layer is removed.\n const callNext = function (this: unknown, ...args: unknown[]) {\n return layer.next.apply(this, args)\n }\n\n const wrapped = replacement(callNext)\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (isFunction(wrapped)) {\n wrapped.prototype = wrapped.prototype || {}\n Object.defineProperties(wrapped, {\n __posthog_wrapped__: {\n enumerable: false,\n value: true,\n },\n __posthog_layer__: {\n enumerable: false,\n value: layer,\n },\n })\n }\n\n source[name] = wrapped\n\n return () => {\n // If we're still on top, hand back whatever we currently delegate to\n // (lower layers may already have been removed, so this is not necessarily\n // the `original` we captured at install time).\n if (source[name] === wrapped) {\n source[name] = layer.next\n return\n }\n\n // Otherwise newer wrappers sit on top of us. Find the posthog layer directly\n // above us and re-point it past us, removing our wrapper from the call path\n // without disturbing the newer wrappers.\n let current: any = source[name]\n while (isFunction(current) && (current as any).__posthog_layer__) {\n const currentLayer = (current as any).__posthog_layer__ as PatchLayer\n if (currentLayer.next === wrapped) {\n currentLayer.next = layer.next\n return\n }\n current = currentLayer.next\n }\n\n // If we get here we're buried under a non-posthog wrapper that closed over\n // us directly, or we've already been removed / replaced wholesale. There's\n // nothing safe to do, so leave the chain untouched.\n }\n } catch {\n return noop\n // This can throw when multiple instrumentation layers try to wrap the same global object,\n // such as XMLHttpRequest, and redefine the same non-configurable wrapper marker.\n }\n}\n","import { PostHog } from '../posthog-core'\nimport { assignableWindow } from '../utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { isArray, isUndefined } from '@posthog/core'\nimport type { TracingHeadersHostnames } from './tracing-headers-types'\nimport type { Extension } from './types'\n\nconst logger = createLogger('[TracingHeaders]')\n\nexport class TracingHeaders implements Extension {\n private _restoreXHRPatch: (() => void) | undefined = undefined\n private _restoreFetchPatch: (() => void) | undefined = undefined\n private _hostnamesForPatch: TracingHeadersHostnames = undefined\n\n constructor(private readonly _instance: PostHog) {}\n\n initialize() {\n this.startIfEnabledOrStop()\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns) {\n // already loaded\n cb()\n return\n }\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'tracing-headers', (err) => {\n if (err) {\n return logger.error('failed to load script', err)\n }\n cb()\n })\n }\n private _getConfiguredHostnames(): string[] | boolean | undefined {\n // Prefer the public `tracing_headers` option; fall back to deprecated aliases.\n return (\n this._instance.config.tracing_headers ??\n this._instance.config.addTracingHeaders ??\n this._instance.config.__add_tracing_headers\n )\n }\n\n private _syncHostnamesForPatch(): TracingHeadersHostnames {\n const hostnames = this._getConfiguredHostnames()\n\n if (isArray(hostnames)) {\n if (isArray(this._hostnamesForPatch)) {\n this._hostnamesForPatch.splice(0, this._hostnamesForPatch.length, ...hostnames)\n } else {\n this._hostnamesForPatch = [...hostnames]\n }\n return hostnames.length > 0 ? this._hostnamesForPatch : undefined\n }\n\n if (isArray(this._hostnamesForPatch)) {\n // we empty the array before reassignment because there may be existing\n // fetch/XHR patches reading this array. if we're in a situation where\n // we're reapplying a patch and it fails for any reason, we've at least\n // avoided sending headers to stale hostnames.\n this._hostnamesForPatch.splice(0)\n }\n\n this._hostnamesForPatch = hostnames || undefined\n return this._hostnamesForPatch\n }\n\n private _stopCapturing(): void {\n this._restoreXHRPatch?.()\n this._restoreFetchPatch?.()\n // we don't want to call these twice so we reset them\n this._restoreXHRPatch = undefined\n this._restoreFetchPatch = undefined\n }\n\n public startIfEnabledOrStop() {\n if (this._syncHostnamesForPatch()) {\n this._loadScript(this._startCapturing)\n } else {\n this._stopCapturing()\n }\n }\n\n private _startCapturing = () => {\n const hostnames = this._syncHostnamesForPatch()\n if (!hostnames) {\n this._stopCapturing()\n return\n }\n\n if (isUndefined(this._restoreXHRPatch)) {\n this._restoreXHRPatch = assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchXHR(\n hostnames,\n () => this._instance.get_distinct_id(),\n this._instance.sessionManager\n )\n }\n if (isUndefined(this._restoreFetchPatch)) {\n this._restoreFetchPatch = assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchFetch(\n hostnames,\n () => this._instance.get_distinct_id(),\n this._instance.sessionManager\n )\n }\n }\n}\n","import { PostHog } from '../../posthog-core'\nimport { PostHogConfig, RemoteConfigResult, SupportedWebVitalsMetrics } from '../../types'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { isBoolean, isNullish, isNumber, isUndefined, isObject, stripUrlHash } from '@posthog/core'\nimport { WEB_VITALS_ALLOWED_METRICS, WEB_VITALS_ENABLED_SERVER_SIDE } from '../../constants'\nimport { window, location } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from '../../utils/globals'\nimport { maskQueryParams } from '@posthog/browser-common/utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from '@posthog/browser-common/utils/event-utils'\n\nconst logger = createLogger('[Web Vitals]')\n\ntype WebVitalsMetricCallback = (metric: any) => void\n\nexport const DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS = 5000\nconst ONE_MINUTE_IN_MILLIS = 60 * 1000\nexport const FIFTEEN_MINUTES_IN_MILLIS = 15 * ONE_MINUTE_IN_MILLIS\n\ntype WebVitalsEventBuffer = { url: string | undefined; metrics: any[]; firstMetricTimestamp: number | undefined }\n\nexport class WebVitalsAutocapture {\n private _enabledServerSide: boolean = false\n private _initialized = false\n\n private _buffer: WebVitalsEventBuffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n private _delayedFlushTimer: ReturnType<typeof setTimeout> | undefined\n\n constructor(private readonly _instance: PostHog) {\n this._enabledServerSide = !!this._instance.persistence?.props[WEB_VITALS_ENABLED_SERVER_SIDE]\n\n this.startIfEnabled()\n }\n\n private get _perfConfig(): PostHogConfig['capture_performance'] {\n return this._instance.config.capture_performance\n }\n\n public get allowedMetrics(): SupportedWebVitalsMetrics[] {\n const clientConfigMetricAllowList: SupportedWebVitalsMetrics[] | undefined = isObject(this._perfConfig)\n ? this._perfConfig?.web_vitals_allowed_metrics\n : undefined\n return !isNullish(clientConfigMetricAllowList)\n ? clientConfigMetricAllowList\n : this._instance.persistence?.props[WEB_VITALS_ALLOWED_METRICS] || ['CLS', 'FCP', 'INP', 'LCP']\n }\n\n public get flushToCaptureTimeoutMs(): number {\n const clientConfig: number | undefined = isObject(this._perfConfig)\n ? this._perfConfig.web_vitals_delayed_flush_ms\n : undefined\n return clientConfig || DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS\n }\n\n public get useAttribution(): boolean {\n const clientConfig: boolean | undefined = isObject(this._perfConfig)\n ? this._perfConfig.web_vitals_attribution\n : undefined\n return clientConfig ?? false\n }\n\n public get _maxAllowedValue(): number {\n const configured =\n isObject(this._perfConfig) && isNumber(this._perfConfig.__web_vitals_max_value)\n ? this._perfConfig.__web_vitals_max_value\n : FIFTEEN_MINUTES_IN_MILLIS\n // you can set to 0 to disable the check or any value over ten seconds\n // 1 milli to 1 minute will be set to 15 minutes, cos that would be a silly low maximum\n return 0 < configured && configured <= ONE_MINUTE_IN_MILLIS ? FIFTEEN_MINUTES_IN_MILLIS : configured\n }\n\n public get isEnabled(): boolean {\n // Always disable web vitals if we're not on http or https\n const protocol = location?.protocol\n if (protocol !== 'http:' && protocol !== 'https:') {\n logger.info('Web Vitals are disabled on non-http/https protocols')\n return false\n }\n\n // Otherwise, check config\n const clientConfig = isObject(this._perfConfig)\n ? this._perfConfig.web_vitals\n : isBoolean(this._perfConfig)\n ? this._perfConfig\n : undefined\n return isBoolean(clientConfig) ? clientConfig : this._enabledServerSide\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled && !this._initialized) {\n logger.info('enabled, starting...')\n this._loadScript(this._startCapturing)\n }\n }\n\n public onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without a capturePerformance key.\n return\n }\n\n const response = result.config\n if (!('capturePerformance' in response)) {\n return\n }\n\n const webVitalsOptIn = isObject(response.capturePerformance) && !!response.capturePerformance.web_vitals\n\n const allowedMetrics = isObject(response.capturePerformance)\n ? response.capturePerformance.web_vitals_allowed_metrics\n : undefined\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [WEB_VITALS_ENABLED_SERVER_SIDE]: webVitalsOptIn,\n })\n\n this._instance.persistence.register({\n [WEB_VITALS_ALLOWED_METRICS]: allowedMetrics,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = webVitalsOptIn\n\n this.startIfEnabled()\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.postHogWebVitalsCallbacks) {\n // already loaded\n cb()\n return\n }\n\n const kind = this.useAttribution ? 'web-vitals-with-attribution' : 'web-vitals'\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, kind, (err) => {\n if (err) {\n logger.error('failed to load script', err)\n return\n }\n\n cb()\n })\n }\n\n private _currentURL(): string | undefined {\n const href = window\n ? this._instance.config.disable_capture_url_hashes\n ? stripUrlHash(window.location.href)\n : window.location.href\n : undefined\n if (!href) {\n logger.error('Could not determine current URL')\n return undefined\n }\n\n // mask url query params\n const maskPersonalDataProperties = this._instance.config.mask_personal_data_properties\n const customPersonalDataProperties = this._instance.config.custom_personal_data_properties\n\n const paramsToMask = maskPersonalDataProperties\n ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n : []\n\n return maskQueryParams(href, paramsToMask, MASKED)\n }\n\n private _flushToCapture = () => {\n clearTimeout(this._delayedFlushTimer)\n if (this._buffer.metrics.length === 0) {\n return\n }\n\n this._instance.capture(\n '$web_vitals',\n this._buffer.metrics.reduce(\n (acc, metric) => ({\n ...acc,\n // the entire event so we can use it in the future e.g. includes google's rating\n [`$web_vitals_${metric.name}_event`]: { ...metric },\n [`$web_vitals_${metric.name}_value`]: metric.value,\n }),\n {}\n )\n )\n this._buffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n }\n\n private _addToBuffer = (metric: any) => {\n this._buffer = this._buffer || { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n\n const $currentUrl = this._currentURL()\n if (isUndefined($currentUrl)) {\n return\n }\n\n if (isNullish(metric?.name) || isNullish(metric?.value)) {\n logger.error('Invalid metric received', metric)\n return\n }\n\n // we observe some very large values sometimes, we'll ignore them\n // since the likelihood of LCP > 1 hour being correct is very low\n if (this._maxAllowedValue && metric.value >= this._maxAllowedValue) {\n logger.error('Ignoring metric with value >= ' + this._maxAllowedValue, metric)\n return\n }\n\n const urlHasChanged = this._buffer.url !== $currentUrl\n\n if (urlHasChanged) {\n // we need to send what we have\n this._flushToCapture()\n\n // poor performance is >4s, we wait twice that time to send\n // this is in case we haven't received all metrics\n // we'll at least gather some\n this._delayedFlushTimer = setTimeout(this._flushToCapture, this.flushToCaptureTimeoutMs)\n }\n\n if (isUndefined(this._buffer.url)) {\n this._buffer.url = $currentUrl\n }\n\n this._buffer.firstMetricTimestamp = isUndefined(this._buffer.firstMetricTimestamp)\n ? Date.now()\n : this._buffer.firstMetricTimestamp\n\n if (metric.attribution && metric.attribution.interactionTargetElement) {\n // we don't want to send the entire element\n // they can be very large\n // TODO we could run this through autocapture code so that we get elements chain info\n // and can display the element in the UI\n metric.attribution.interactionTargetElement = undefined\n }\n\n const sessionIds = this._instance.sessionManager?.checkAndGetSessionAndWindowId(true)\n const bufferedMetric: Record<string, unknown> = {\n ...metric,\n $current_url: $currentUrl,\n timestamp: Date.now(),\n }\n if (!isUndefined(sessionIds)) {\n bufferedMetric.$session_id = sessionIds.sessionId\n bufferedMetric.$window_id = sessionIds.windowId\n }\n\n this._buffer.metrics.push(bufferedMetric)\n\n if (this._buffer.metrics.length === this.allowedMetrics.length) {\n // we have all allowed metrics\n this._flushToCapture()\n }\n }\n\n private _startCapturing = () => {\n // IMPORTANT: web-vitals does not provide cleanup functions and warns against\n // calling functions more than once per page load. Each call creates new\n // PerformanceObservers that persist for the page lifetime.\n // See: https://github.com/GoogleChrome/web-vitals/issues/629\n if (this._initialized) {\n return\n }\n\n let onLCP: WebVitalsMetricCallback | undefined\n let onCLS: WebVitalsMetricCallback | undefined\n let onFCP: WebVitalsMetricCallback | undefined\n let onINP: WebVitalsMetricCallback | undefined\n\n const posthogExtensions = assignableWindow.__PosthogExtensions__\n if (!isUndefined(posthogExtensions) && !isUndefined(posthogExtensions.postHogWebVitalsCallbacks)) {\n ;({ onLCP, onCLS, onFCP, onINP } = posthogExtensions.postHogWebVitalsCallbacks)\n }\n\n if (!onLCP || !onCLS || !onFCP || !onINP) {\n logger.error('web vitals callbacks not loaded - not starting')\n return\n }\n\n // register performance observers\n if (this.allowedMetrics.indexOf('LCP') > -1) {\n onLCP(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('CLS') > -1) {\n onCLS(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('FCP') > -1) {\n onFCP(this._addToBuffer.bind(this))\n }\n if (this.allowedMetrics.indexOf('INP') > -1) {\n onINP(this._addToBuffer.bind(this))\n }\n\n this._initialized = true\n }\n}\n","import {\n SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS,\n SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS,\n SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS,\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport { FlagVariant, RemoteConfig, SessionRecordingPersistedConfig, SessionRecordingUrlTrigger } from '../../../types'\nimport { isNullish, isBoolean, isString, isObject, isUndefined } from '@posthog/core'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { getTargetingUrl } from '@posthog/browser-common/utils/url-targeting-utils'\n\nexport const DISABLED = 'disabled'\nexport const SAMPLED = 'sampled'\nexport const ACTIVE = 'active'\nexport const BUFFERING = 'buffering'\nexport const PAUSED = 'paused'\nexport const LAZY_LOADING = 'lazy_loading'\nexport const AWAITING_CONFIG = 'awaiting_config'\nexport const MISSING_CONFIG = 'missing_config'\nexport const RRWEB_ERROR = 'rrweb_error'\n\nconst TRIGGER = 'trigger'\nexport const TRIGGER_ACTIVATED = TRIGGER + '_activated'\nexport const TRIGGER_PENDING = TRIGGER + '_pending'\nexport const TRIGGER_DISABLED = TRIGGER + '_' + DISABLED\n\nexport interface RecordingTriggersStatus {\n get receivedFlags(): boolean\n get isRecordingEnabled(): false | true | undefined\n get isSampled(): false | true | null\n get rrwebError(): boolean\n get urlTriggerMatching(): URLTriggerMatching\n get eventTriggerMatching(): EventTriggerMatching\n get linkedFlagMatching(): LinkedFlagMatching\n get sessionId(): string\n}\n\n/**\n * Extended interface for V2 trigger groups\n */\nexport interface RecordingTriggersStatusV2 extends RecordingTriggersStatus {\n get triggerGroupMatchers(): TriggerGroupMatching[]\n get triggerGroupSamplingResults(): Map<string, boolean> // group id -> sampled decision\n get minimumDuration(): number | null\n}\n\nexport type TriggerType = 'url' | 'event'\n/* \ntriggers can have one of three statuses:\n * - trigger_activated: the trigger met conditions to start recording\n * - trigger_pending: the trigger is present, but the conditions are not yet met\n * - trigger_disabled: the trigger is not present\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst triggerStatuses = [TRIGGER_ACTIVATED, TRIGGER_PENDING, TRIGGER_DISABLED] as const\nexport type TriggerStatus = (typeof triggerStatuses)[number]\n\nfunction persistedTriggerStatus(\n instance: PostHog | undefined,\n triggerCount: number,\n groupId: string | undefined,\n groupPrefix: string,\n fallbackPersistenceKey: string,\n sessionId: string\n): TriggerStatus {\n if (triggerCount === 0) {\n return TRIGGER_DISABLED\n }\n\n // V2: Use per-group persistence key if groupId is provided\n const persistenceKey = groupId ? groupPrefix + groupId : fallbackPersistenceKey\n const currentTriggerSession = instance?.get_property(persistenceKey)\n return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n}\n\n/**\n * Session recording starts in buffering mode while waiting for \"flags response\".\n * Once the response is received, it might be disabled, active or sampled.\n * When \"sampled\" that means a sample rate is set, and the last time the session ID rotated\n * the sample rate determined this session should be sent to the server.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst sessionRecordingStatuses = [\n DISABLED,\n SAMPLED,\n ACTIVE,\n BUFFERING,\n PAUSED,\n LAZY_LOADING,\n AWAITING_CONFIG,\n MISSING_CONFIG,\n RRWEB_ERROR,\n] as const\nexport type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]\n\n// while we have both lazy and eager loaded replay we might get either type of config\ntype ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig\n\n// Type for trigger group matching config - subset of SessionRecordingPersistedConfig properties\ntype TriggerMatchingConfig = Pick<\n SessionRecordingPersistedConfig,\n 'urlTriggers' | 'urlBlocklist' | 'eventTriggers' | 'linkedFlag'\n>\n\nfunction sessionRecordingUrlTriggerMatches(\n url: string,\n triggers: SessionRecordingUrlTrigger[],\n compiledRegexCache?: Map<string, RegExp>\n) {\n return triggers.some((trigger) => {\n switch (trigger.matching) {\n case 'regex': {\n const regex = compiledRegexCache?.get(trigger.url) ?? new RegExp(trigger.url)\n return regex.test(url)\n }\n default:\n return false\n }\n })\n}\n\nexport interface TriggerStatusMatching {\n triggerStatus(sessionId: string): TriggerStatus\n stop(): void\n}\nexport class OrTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = this._matchers.map((m) => m.triggerStatus(sessionId))\n if (statuses.includes(TRIGGER_ACTIVATED)) {\n return TRIGGER_ACTIVATED\n }\n if (statuses.includes(TRIGGER_PENDING)) {\n return TRIGGER_PENDING\n }\n return TRIGGER_DISABLED\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class AndTriggerMatching implements TriggerStatusMatching {\n constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n triggerStatus(sessionId: string): TriggerStatus {\n const statuses = new Set<TriggerStatus>()\n for (const matcher of this._matchers) {\n statuses.add(matcher.triggerStatus(sessionId))\n }\n\n // trigger_disabled means no config\n statuses.delete(TRIGGER_DISABLED)\n switch (statuses.size) {\n case 0:\n return TRIGGER_DISABLED\n case 1:\n return Array.from(statuses)[0]\n default:\n return TRIGGER_PENDING\n }\n }\n\n stop(): void {\n this._matchers.forEach((m) => m.stop())\n }\n}\n\nexport class PendingTriggerMatching implements TriggerStatusMatching {\n triggerStatus(): TriggerStatus {\n return TRIGGER_PENDING\n }\n\n stop(): void {\n // no-op\n }\n}\n\nexport class AlwaysActivatedTriggerMatching implements TriggerStatusMatching {\n triggerStatus(): TriggerStatus {\n return TRIGGER_ACTIVATED\n }\n\n stop(): void {\n // no-op\n }\n}\n\nconst isEagerLoadedConfig = (x: ReplayConfigType | TriggerMatchingConfig): x is RemoteConfig => {\n return 'sessionRecording' in x\n}\n\nexport class URLTriggerMatching implements TriggerStatusMatching {\n _urlTriggers: SessionRecordingUrlTrigger[] = []\n _urlBlocklist: SessionRecordingUrlTrigger[] = []\n\n private _compiledTriggerRegexes: Map<string, RegExp> = new Map()\n private _compiledBlocklistRegexes: Map<string, RegExp> = new Map()\n\n private _lastCheckedUrl: string = ''\n private _groupId?: string // Optional group ID for V2 per-group persistence\n\n urlBlocked: boolean = false\n\n constructor(\n private readonly _instance: PostHog,\n groupId?: string\n ) {\n this._groupId = groupId\n }\n\n onConfig(config: ReplayConfigType | TriggerMatchingConfig) {\n this._urlTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlTriggers\n : []\n : config?.urlTriggers) || []\n this._urlBlocklist =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.urlBlocklist\n : []\n : config?.urlBlocklist) || []\n\n this._compileRegexCache()\n }\n\n /**\n * Compiles and caches RegExp objects from URL triggers and blocklist.\n * This prevents recreating RegExp objects on every rrweb event\n */\n private _compileRegexCache(): void {\n this._compiledTriggerRegexes.clear()\n this._compiledBlocklistRegexes.clear()\n\n for (const trigger of this._urlTriggers) {\n if (trigger.matching === 'regex' && !this._compiledTriggerRegexes.has(trigger.url)) {\n try {\n this._compiledTriggerRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL trigger regex pattern:', trigger.url, e)\n }\n }\n }\n\n for (const trigger of this._urlBlocklist) {\n if (trigger.matching === 'regex' && !this._compiledBlocklistRegexes.has(trigger.url)) {\n try {\n this._compiledBlocklistRegexes.set(trigger.url, new RegExp(trigger.url))\n } catch (e) {\n logger.error('Invalid URL blocklist regex pattern:', trigger.url, e)\n }\n }\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _urlTriggerStatus(sessionId: string): TriggerStatus {\n return persistedTriggerStatus(\n this._instance,\n this._urlTriggers.length,\n this._groupId,\n SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n sessionId\n )\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const urlTriggerStatus = this._urlTriggerStatus(sessionId)\n const eitherIsActivated = urlTriggerStatus === TRIGGER_ACTIVATED\n const eitherIsPending = urlTriggerStatus === TRIGGER_PENDING\n\n const result = eitherIsActivated ? TRIGGER_ACTIVATED : eitherIsPending ? TRIGGER_PENDING : TRIGGER_DISABLED\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS]: result,\n })\n return result\n }\n\n /**\n * Check URL blocklist and pause/resume recording accordingly\n * This is separate from trigger checking and is used by both V1 and V2\n *\n * Performance optimization: Only checks when URL changes to avoid redundant regex matching\n */\n checkUrlBlocklist(onPause: () => void, onResume: () => void): void {\n const url = getTargetingUrl(this._instance)\n if (!url) {\n return\n }\n\n // Performance optimization: Skip if URL hasn't changed since last check\n if (url === this._lastCheckedUrl) {\n return\n }\n this._lastCheckedUrl = url\n\n // Check blocklist and call onPause/onResume\n // Note: DON'T set this.urlBlocked here - let the callbacks (_pauseRecording/_resumeRecording) set it\n const wasBlocked = this.urlBlocked\n const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n if (wasBlocked && isNowBlocked) {\n return\n }\n\n if (isNowBlocked && !wasBlocked) {\n onPause()\n } else if (!isNowBlocked && wasBlocked) {\n onResume()\n }\n }\n\n checkUrlTriggerConditions(\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n const url = getTargetingUrl(this._instance)\n if (!url) {\n return\n }\n\n // Performance optimization: Skip if URL hasn't changed since last check\n // This prevents redundant checks on every rrweb event\n if (url === this._lastCheckedUrl) {\n return\n }\n this._lastCheckedUrl = url\n\n // Check blocklist and call onPause/onResume\n // Note: DON'T set this.urlBlocked here - let the callbacks (_pauseRecording/_resumeRecording) set it\n const wasBlocked = this.urlBlocked\n const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n if (isNowBlocked && !wasBlocked) {\n onPause()\n } else if (!isNowBlocked && wasBlocked) {\n onResume()\n }\n\n // Check URL triggers\n const isActivated = this._urlTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n const urlMatches = sessionRecordingUrlTriggerMatches(url, this._urlTriggers, this._compiledTriggerRegexes)\n\n if (!isActivated && urlMatches) {\n onActivate('url', url)\n }\n }\n\n stop(): void {\n this._lastCheckedUrl = ''\n }\n}\n\nexport class LinkedFlagMatching implements TriggerStatusMatching {\n linkedFlag: string | FlagVariant | null = null\n linkedFlagSeen: boolean = false\n private _flagListenerCleanup: () => void = () => {}\n constructor(private readonly _instance: PostHog) {}\n\n triggerStatus(): TriggerStatus {\n let result = TRIGGER_PENDING\n if (isNullish(this.linkedFlag)) {\n result = TRIGGER_DISABLED\n }\n if (this.linkedFlagSeen) {\n result = TRIGGER_ACTIVATED\n }\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS]: result,\n })\n return result\n }\n\n onConfig(\n config: ReplayConfigType | TriggerMatchingConfig,\n onStarted: (flag: string, variant: string | null) => void\n ) {\n this.linkedFlag =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.linkedFlag\n : null\n : config?.linkedFlag) || null\n\n if (!isNullish(this.linkedFlag) && !this.linkedFlagSeen) {\n const linkedFlag = isString(this.linkedFlag) ? this.linkedFlag : this.linkedFlag.flag\n const linkedVariant = isString(this.linkedFlag) ? null : this.linkedFlag.variant\n this._flagListenerCleanup = this._instance.onFeatureFlags((_flags, variants) => {\n const flagIsPresent = isObject(variants) && linkedFlag in variants\n let linkedFlagMatches = false\n if (flagIsPresent) {\n const variantForFlagKey = variants[linkedFlag]\n if (isBoolean(variantForFlagKey)) {\n linkedFlagMatches = variantForFlagKey === true\n } else if (linkedVariant) {\n linkedFlagMatches = variantForFlagKey === linkedVariant\n } else {\n // then this is a variant flag and we want to match any string\n linkedFlagMatches = !!variantForFlagKey\n }\n }\n // onFeatureFlags fires on every flag reload, so only report activation on the\n // inactive->active transition. Firing on every reload while the flag stays truthy\n // re-reports linked_flag_matched and (via onStarted -> _onTriggerActivated) restarts\n // the full-snapshot interval each time, which can postpone periodic full snapshots\n // indefinitely when flags reload more often than full_snapshot_interval_millis.\n const isNewActivation = linkedFlagMatches && !this.linkedFlagSeen\n this.linkedFlagSeen = linkedFlagMatches\n if (isNewActivation) {\n onStarted(linkedFlag, linkedVariant)\n }\n })\n }\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig, onStarted: (flag: string, variant: string | null) => void) {\n this.onConfig(response, onStarted)\n }\n\n stop(): void {\n this._flagListenerCleanup()\n }\n}\n\nexport class EventTriggerMatching implements TriggerStatusMatching {\n _eventTriggers: string[] = []\n private _groupId?: string // Optional group ID for V2 per-group persistence\n\n constructor(\n private readonly _instance: PostHog,\n groupId?: string\n ) {\n this._groupId = groupId\n }\n\n onConfig(config: ReplayConfigType | TriggerMatchingConfig) {\n // Handle both RemoteConfig (nested) and SessionRecordingPersistedConfig (flattened) structures\n this._eventTriggers =\n (isEagerLoadedConfig(config)\n ? isObject(config.sessionRecording)\n ? config.sessionRecording?.eventTriggers\n : []\n : config?.eventTriggers) || []\n }\n\n /**\n * @deprecated Use onConfig instead\n */\n onRemoteConfig(response: RemoteConfig) {\n this.onConfig(response)\n }\n\n private _eventTriggerStatus(sessionId: string): TriggerStatus {\n const triggerCount = this._eventTriggers.length\n return persistedTriggerStatus(\n this._instance,\n triggerCount,\n this._groupId,\n SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n sessionId\n )\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n const eventTriggerStatus = this._eventTriggerStatus(sessionId)\n const result =\n eventTriggerStatus === TRIGGER_ACTIVATED\n ? TRIGGER_ACTIVATED\n : eventTriggerStatus === TRIGGER_PENDING\n ? TRIGGER_PENDING\n : TRIGGER_DISABLED\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS]: result,\n })\n return result\n }\n\n checkEventTriggerConditions(\n eventName: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n if (this._eventTriggers.length === 0) {\n return\n }\n\n const isActivated = this._eventTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n const includes = this._eventTriggers.includes(eventName)\n if (!isActivated && includes) {\n onActivate('event', eventName)\n }\n }\n\n stop(): void {\n // no-op\n }\n}\n\n/**\n * V2 Trigger Group Matching - manages a single trigger group with its own conditions\n */\nexport class TriggerGroupMatching implements TriggerStatusMatching {\n private _urlTriggerMatching: URLTriggerMatching\n private _eventTriggerMatching: EventTriggerMatching\n private _linkedFlagMatching: LinkedFlagMatching\n private _combinedMatching: TriggerStatusMatching\n public readonly group: import('../../../types').SessionRecordingTriggerGroup\n\n constructor(\n private readonly _instance: PostHog,\n group: import('../../../types').SessionRecordingTriggerGroup,\n onFlagStarted: (flag: string, variant: string | null) => void\n ) {\n this.group = group\n // V2: Pass groupId to child matchers for per-group persistence\n this._urlTriggerMatching = new URLTriggerMatching(_instance, group.id)\n this._eventTriggerMatching = new EventTriggerMatching(_instance, group.id)\n this._linkedFlagMatching = new LinkedFlagMatching(_instance)\n\n // Check if all conditions are empty (no events, urls, or flags)\n const hasEvents = group.conditions.events && group.conditions.events.length > 0\n const hasUrls = group.conditions.urls && group.conditions.urls.length > 0\n const hasFlag = !!group.conditions.flag\n\n if (!hasEvents && !hasUrls && !hasFlag) {\n // Empty conditions = trigger immediately on session start\n this._combinedMatching = new AlwaysActivatedTriggerMatching()\n } else {\n // V2: Events arrive as objects {name, properties?} from the server.\n // Extract just the names — property filter evaluation is handled by the strategy.\n const eventNames = (group.conditions.events || []).map((e) => e.name)\n\n // Convert group config to the format expected by the individual matchers\n const config: TriggerMatchingConfig = {\n urlTriggers: group.conditions.urls || [],\n eventTriggers: eventNames,\n linkedFlag: group.conditions.flag || null,\n urlBlocklist: [],\n }\n\n this._urlTriggerMatching.onConfig(config)\n this._eventTriggerMatching.onConfig(config)\n this._linkedFlagMatching.onConfig(config, onFlagStarted)\n\n // Combine matchers based on the group's matchType\n const matchers = [this._eventTriggerMatching, this._urlTriggerMatching, this._linkedFlagMatching]\n this._combinedMatching =\n group.conditions.matchType === 'any'\n ? new OrTriggerMatching(matchers)\n : new AndTriggerMatching(matchers)\n }\n }\n\n triggerStatus(sessionId: string): TriggerStatus {\n return this._combinedMatching.triggerStatus(sessionId)\n }\n\n checkEventTriggerConditions(\n eventName: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n this._eventTriggerMatching.checkEventTriggerConditions(eventName, onActivate, sessionId)\n }\n\n checkUrlTriggerConditions(\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n sessionId: string\n ) {\n this._urlTriggerMatching.checkUrlTriggerConditions(onPause, onResume, onActivate, sessionId)\n }\n\n /**\n * V2: Activate this group's trigger and persist to group-specific key\n * This prevents cross-group contamination and survives page reloads\n */\n activateTrigger(triggerType: TriggerType, sessionId: string): void {\n const persistenceKey =\n triggerType === 'url'\n ? SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX + this.group.id\n : SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX + this.group.id\n\n this._instance.persistence?.register({\n [persistenceKey]: sessionId,\n })\n }\n\n stop(): void {\n this._urlTriggerMatching.stop()\n this._eventTriggerMatching.stop()\n this._linkedFlagMatching.stop()\n }\n}\n\n// we need a no-op matcher before we can lazy-load the other matches, since all matchers wait on remote config anyway\nexport function nullMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (triggersStatus.rrwebError) {\n return RRWEB_ERROR\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n return BUFFERING\n}\n\nexport function anyMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (triggersStatus.rrwebError) {\n return RRWEB_ERROR\n }\n\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const sampledActive = triggersStatus.isSampled === true\n const triggerMatches = new OrTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ]).triggerStatus(triggersStatus.sessionId)\n\n if (sampledActive) {\n return SAMPLED\n }\n\n if (triggerMatches === TRIGGER_ACTIVATED) {\n return ACTIVE\n }\n\n if (triggerMatches === TRIGGER_PENDING) {\n // even if sampled active is false, we should still be buffering\n // since a pending trigger could override it\n return BUFFERING\n }\n\n // if sampling is set and the session is already decided to not be sampled\n // then we should never be active\n if (triggersStatus.isSampled === false) {\n return DISABLED\n }\n\n return ACTIVE\n}\n\nexport function allMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n if (triggersStatus.rrwebError) {\n return RRWEB_ERROR\n }\n\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const andTriggerMatch = new AndTriggerMatching([\n triggersStatus.eventTriggerMatching,\n triggersStatus.urlTriggerMatching,\n triggersStatus.linkedFlagMatching,\n ])\n const currentTriggerStatus = andTriggerMatch.triggerStatus(triggersStatus.sessionId)\n const hasTriggersConfigured = currentTriggerStatus !== TRIGGER_DISABLED\n\n const hasSamplingConfigured = isBoolean(triggersStatus.isSampled)\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_PENDING) {\n return BUFFERING\n }\n\n if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_DISABLED) {\n return DISABLED\n }\n\n // sampling can't ever cause buffering, it's always determined right away or not configured\n if (hasSamplingConfigured && !triggersStatus.isSampled) {\n return DISABLED\n }\n\n // If sampling is configured and set to true, return sampled\n if (triggersStatus.isSampled === true) {\n return SAMPLED\n }\n\n return ACTIVE\n}\n\n/**\n * V2 Trigger Groups Status Matcher - implements union behavior:\n * 1. Evaluate ALL trigger groups\n * 2. For each matching group, check if its sample rate hits\n * 3. If ANY group's sample rate hits → record session\n */\nexport function triggerGroupsMatchSessionRecordingStatus(\n triggersStatus: RecordingTriggersStatusV2\n): SessionRecordingStatus {\n if (triggersStatus.rrwebError) {\n return RRWEB_ERROR\n }\n\n if (!triggersStatus.receivedFlags) {\n return BUFFERING\n }\n\n if (!triggersStatus.isRecordingEnabled) {\n return DISABLED\n }\n\n // Check if any URL is blocked (url blocklist is global, not per-group)\n if (triggersStatus.urlTriggerMatching.urlBlocked) {\n return PAUSED\n }\n\n const groupMatchers = triggersStatus.triggerGroupMatchers\n const samplingResults = triggersStatus.triggerGroupSamplingResults\n\n if (groupMatchers.length === 0) {\n // No V2 groups configured - should not happen, but treat as disabled\n return DISABLED\n }\n\n // Evaluate all groups to determine overall status\n let anyGroupPending = false\n let anyGroupSampled = false\n\n for (const matcher of groupMatchers) {\n const groupStatus = matcher.triggerStatus(triggersStatus.sessionId)\n\n if (groupStatus === TRIGGER_ACTIVATED) {\n // Check if this group's sample rate hit\n const groupId = matcher.group.id\n const samplingResult = samplingResults.get(groupId)\n\n if (isUndefined(samplingResult)) {\n logger.warn('[V2 Triggers] Group activated but no sampling decision found', { groupId })\n } else if (samplingResult === true) {\n anyGroupSampled = true\n }\n } else if (groupStatus === TRIGGER_PENDING) {\n anyGroupPending = true\n }\n }\n\n // Union behavior: if ANY group hit its sample rate, record\n if (anyGroupSampled) {\n return SAMPLED\n }\n\n // If any group is pending, keep buffering\n if (anyGroupPending) {\n return BUFFERING\n }\n\n // All groups are either disabled, conditions not met, or sampled out\n return DISABLED\n}\n","import { PostHog } from '../../../posthog-core'\nimport {\n CaptureResult,\n SessionRecordingPersistedConfig,\n SessionRecordingTriggerGroup,\n SessionStartReason,\n} from '../../../types'\nimport {\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_SAMPLE_RATE,\n SESSION_RECORDING_PAST_MINIMUM_DURATION,\n SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX,\n SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS,\n SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG,\n SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT,\n STORED_PERSON_PROPERTIES_KEY,\n} from '../../../constants'\nimport {\n EventTriggerMatching,\n LinkedFlagMatching,\n URLTriggerMatching,\n TriggerGroupMatching,\n SessionRecordingStatus,\n allMatchSessionRecordingStatus,\n anyMatchSessionRecordingStatus,\n triggerGroupsMatchSessionRecordingStatus,\n TriggerType,\n AndTriggerMatching,\n OrTriggerMatching,\n TriggerStatusMatching,\n TRIGGER_PENDING,\n} from './triggerMatching'\nimport { sampleOnProperty } from '../../sampling'\nimport { isBoolean, isNull, isNullish, isNumber, isObject, isUndefined } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { matchTriggerPropertyFilters } from '@posthog/browser-common/utils/property-utils'\n\nconst logger = createLogger('[SessionRecording]')\n\n/**\n * Decisions are stored as `sessionId` (sampled in) or `'!' + sessionId` (sampled out), so another\n * session can never inherit them. Anything else (legacy `true`/`false`, another session's decision)\n * decodes to null and is re-decided — safe, since `sampleOnProperty` is deterministic per session id.\n */\nconst NOT_SAMPLED_PREFIX = '!'\n\nexport function encodeSamplingDecision(sessionId: string, isSampled: boolean): string {\n return isSampled ? sessionId : NOT_SAMPLED_PREFIX + sessionId\n}\n\nexport function decodeSamplingDecision(storedValue: unknown, sessionId: string): boolean | null {\n if (storedValue === sessionId) {\n return true\n }\n if (storedValue === NOT_SAMPLED_PREFIX + sessionId) {\n return false\n }\n return null\n}\n\n/**\n * Shared context that strategies need to access from the recorder\n */\nexport interface RecordingStrategyContext {\n instance: PostHog\n sessionId: string\n isSampled: boolean | null\n rrwebError: boolean\n urlTriggerMatching: URLTriggerMatching\n eventTriggerMatching: EventTriggerMatching\n linkedFlagMatching: LinkedFlagMatching\n remoteConfig: SessionRecordingPersistedConfig | undefined\n}\n\n/**\n * Strategy interface for handling different recording trigger configurations\n */\nexport interface RecordingStrategy {\n /**\n * Initialize the strategy with remote config\n */\n onRemoteConfig(config: SessionRecordingPersistedConfig): void\n\n /**\n * Get the current recording status\n */\n getStatus(context: RecordingStrategyContext): SessionRecordingStatus\n\n /**\n * Get the minimum duration for this session (if any)\n */\n getMinimumDuration(sessionId: string): number | null\n\n /**\n * Check URL triggers on each navigation\n * Note: URL is read from window.location.href internally\n */\n checkUrlTriggers(\n sessionId: string,\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): void\n\n /**\n * Setup event trigger listeners\n */\n setupEventTriggerListeners(\n onEvent: (callback: (event: CaptureResult) => void) => () => void,\n sessionId: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): (() => void) | undefined\n\n /**\n * Make sampling decisions for the session\n */\n makeSamplingDecisions(sessionId: string): void\n\n /**\n * Ensure a sampling decision exists for this session, re-deciding from the strategy's own\n * config when it is missing (e.g. wiped by posthog.reset()). No-op when sampling isn't configured.\n */\n ensureSamplingDecision(sessionId: string): void\n\n /**\n * Called after the initial buffer flush (performance optimization hook)\n */\n onFlushComplete(): void\n\n /**\n * Clean up persistence keys for conditional recording\n */\n clearConditionalRecordingPersistence(): void\n\n /**\n * Update session properties with active trigger information\n */\n updateActiveTriggers(sessionId: string): void\n\n /**\n * Check if triggers are in pending state (waiting for activation)\n */\n hasPendingTriggers(sessionId: string): boolean\n\n /**\n * Stop and cleanup the strategy\n */\n stop(): void\n}\n\n/**\n * V1 Strategy: Legacy trigger matching with global URL/Event/Flag triggers\n */\nexport class V1RecordingStrategy implements RecordingStrategy {\n private _triggerStatusMatcher: TriggerStatusMatching | undefined\n private _removeEventTriggerCaptureHook: (() => void) | undefined\n private _sampleRate: number | null = null\n private _recordingStatusFunction: typeof anyMatchSessionRecordingStatus = allMatchSessionRecordingStatus\n\n constructor(\n private readonly _instance: PostHog,\n private readonly _urlTriggerMatching: URLTriggerMatching,\n private readonly _eventTriggerMatching: EventTriggerMatching,\n private readonly _linkedFlagMatching: LinkedFlagMatching,\n private readonly _reportStarted: (reason: SessionStartReason, payload?: Record<string, any>) => void,\n private readonly _tryTakeFullSnapshot: () => void,\n private readonly _onTriggerActivated: () => void\n ) {}\n\n onRemoteConfig(config: SessionRecordingPersistedConfig): void {\n this._sampleRate = isNumber(config.sampleRate) ? config.sampleRate : null\n\n // Setup trigger matching strategy (AND vs OR)\n if (config.triggerMatchType === 'any') {\n this._triggerStatusMatcher = new OrTriggerMatching([this._eventTriggerMatching, this._urlTriggerMatching])\n this._recordingStatusFunction = anyMatchSessionRecordingStatus\n } else {\n // either the setting is \"ALL\" or we default to the most restrictive\n this._triggerStatusMatcher = new AndTriggerMatching([this._eventTriggerMatching, this._urlTriggerMatching])\n this._recordingStatusFunction = allMatchSessionRecordingStatus\n }\n\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: config.triggerMatchType,\n })\n\n this._urlTriggerMatching.onConfig(config)\n this._eventTriggerMatching.onConfig(config)\n\n this._linkedFlagMatching.onConfig(config, (flag, variant) => {\n this._reportStarted('linked_flag_matched', { flag, variant })\n this._onTriggerActivated()\n })\n }\n\n getStatus(context: RecordingStrategyContext): SessionRecordingStatus {\n return this._recordingStatusFunction({\n receivedFlags: true,\n isRecordingEnabled: true,\n isSampled: context.isSampled,\n rrwebError: context.rrwebError,\n urlTriggerMatching: context.urlTriggerMatching,\n eventTriggerMatching: context.eventTriggerMatching,\n linkedFlagMatching: context.linkedFlagMatching,\n sessionId: context.sessionId,\n })\n }\n\n getMinimumDuration(sessionId: string): number | null {\n // V1: Minimum duration is global from config, doesn't need sessionId\n void sessionId\n const config = this._instance.get_property('$session_recording_remote_config') as\n | SessionRecordingPersistedConfig\n | undefined\n const duration = config?.minimumDurationMilliseconds\n return isNumber(duration) ? duration : null\n }\n\n checkUrlTriggers(\n sessionId: string,\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): void {\n this._urlTriggerMatching.checkUrlTriggerConditions(onPause, onResume, onActivate, sessionId)\n }\n\n setupEventTriggerListeners(\n onEvent: (callback: (event: CaptureResult) => void) => () => void,\n sessionId: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): (() => void) | undefined {\n if (this._eventTriggerMatching._eventTriggers.length === 0 || !isNullish(this._removeEventTriggerCaptureHook)) {\n return undefined\n }\n\n this._removeEventTriggerCaptureHook = onEvent((event: CaptureResult) => {\n try {\n this._eventTriggerMatching.checkEventTriggerConditions(event.event, onActivate, sessionId)\n } catch (e) {\n logger.error('Could not activate event trigger', e)\n }\n })\n\n return this._removeEventTriggerCaptureHook\n }\n\n makeSamplingDecisions(sessionId: string): void {\n const currentSampleRate = this._sampleRate\n\n if (!isNumber(currentSampleRate)) {\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n this._instance.persistence?.unregister(SESSION_RECORDING_SAMPLE_RATE)\n return\n }\n\n const storedValue = this._instance.get_property(SESSION_RECORDING_IS_SAMPLED)\n const storedSampleRate = this._instance.get_property(SESSION_RECORDING_SAMPLE_RATE)\n\n const storedIsSampled = decodeSamplingDecision(storedValue, sessionId)\n\n // Re-decide when the rate changed, or a legacy sampled-in decision predates rate storage.\n // An explicit override stores null as the rate, so only undefined means legacy missing-rate.\n const sampleRateChanged = isNumber(storedSampleRate) && storedSampleRate !== currentSampleRate\n const sampledInWithoutStoredRate = isUndefined(storedSampleRate) && storedValue === sessionId\n const makeDecision = sampleRateChanged || sampledInWithoutStoredRate || !isBoolean(storedIsSampled)\n const shouldSample = makeDecision ? sampleOnProperty(sessionId, currentSampleRate) : storedIsSampled!\n\n if (makeDecision) {\n if (shouldSample) {\n this._reportStarted('sampled')\n } else {\n logger.warn(\n `Sample rate (${currentSampleRate}) has determined that this sessionId (${sessionId}) will not be sent to the server.`\n )\n }\n }\n\n this._instance.persistence?.register({\n [SESSION_RECORDING_IS_SAMPLED]: encodeSamplingDecision(sessionId, shouldSample),\n [SESSION_RECORDING_SAMPLE_RATE]:\n isNull(storedSampleRate) && storedValue === sessionId ? null : currentSampleRate,\n })\n }\n\n ensureSamplingDecision(sessionId: string): void {\n if (!isNumber(this._sampleRate)) {\n return\n }\n const storedValue = this._instance.get_property(SESSION_RECORDING_IS_SAMPLED)\n if (!isBoolean(decodeSamplingDecision(storedValue, sessionId))) {\n this.makeSamplingDecisions(sessionId)\n }\n }\n\n onFlushComplete(): void {\n // V1 doesn't use this optimization\n }\n\n clearConditionalRecordingPersistence(): void {\n this._instance.persistence?.unregister(SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION)\n this._instance.persistence?.unregister(SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION)\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n this._instance.persistence?.unregister(SESSION_RECORDING_SAMPLE_RATE)\n this._instance.persistence?.unregister(SESSION_RECORDING_PAST_MINIMUM_DURATION)\n }\n\n updateActiveTriggers(sessionId: string): void {\n void sessionId\n // V1 doesn't track active triggers in session properties\n }\n\n hasPendingTriggers(sessionId: string): boolean {\n return this._triggerStatusMatcher?.triggerStatus(sessionId) === TRIGGER_PENDING\n }\n\n stop(): void {\n this._removeEventTriggerCaptureHook?.()\n this._removeEventTriggerCaptureHook = undefined\n this._eventTriggerMatching.stop()\n this._urlTriggerMatching.stop()\n this._linkedFlagMatching.stop()\n }\n}\n\n/**\n * V2 Strategy: Trigger groups with per-group sampling and union behavior\n */\nexport class V2TriggerGroupStrategy implements RecordingStrategy {\n private _triggerGroupMatchers: TriggerGroupMatching[] = []\n private _triggerGroupSamplingResults: Map<string, boolean> = new Map()\n private _hasCompletedInitialFlush: boolean = false\n private _removeEventTriggerCaptureHook: (() => void) | undefined\n\n constructor(\n private readonly _instance: PostHog,\n private readonly _urlTriggerMatching: URLTriggerMatching,\n private readonly _reportStarted: (reason: SessionStartReason, payload?: Record<string, any>) => void,\n private readonly _tryAddCustomEvent: (tag: string, payload: any) => void,\n private readonly _onTriggerActivated: () => void\n ) {}\n\n onRemoteConfig(config: SessionRecordingPersistedConfig): void {\n if (!config.triggerGroups || config.triggerGroups.length === 0) {\n logger.warn('[V2Strategy] No trigger groups configured')\n return\n }\n\n // Setup trigger group matchers\n this._setupTriggerGroups(config.triggerGroups)\n\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: 'v2_trigger_groups',\n [SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT]: config.triggerGroups.length,\n })\n\n // V2 needs URL blocklist (but not URL triggers)\n this._urlTriggerMatching.onConfig(config)\n }\n\n getStatus(context: RecordingStrategyContext): SessionRecordingStatus {\n return triggerGroupsMatchSessionRecordingStatus({\n receivedFlags: true,\n isRecordingEnabled: true,\n isSampled: context.isSampled,\n rrwebError: context.rrwebError,\n urlTriggerMatching: context.urlTriggerMatching,\n eventTriggerMatching: context.eventTriggerMatching,\n linkedFlagMatching: context.linkedFlagMatching,\n sessionId: context.sessionId,\n triggerGroupMatchers: this._triggerGroupMatchers,\n triggerGroupSamplingResults: this._triggerGroupSamplingResults,\n minimumDuration: this.getMinimumDuration(context.sessionId),\n })\n }\n\n getMinimumDuration(sessionId: string): number | null {\n let lowestDuration: number | null = null\n\n for (const matcher of this._triggerGroupMatchers) {\n const groupStatus = matcher.triggerStatus(sessionId)\n\n // Only consider activated groups - pending groups haven't triggered yet\n if (groupStatus === 'trigger_activated') {\n const groupDuration = matcher.group.minDurationMs\n if (isNumber(groupDuration)) {\n if (isNull(lowestDuration) || groupDuration < lowestDuration) {\n lowestDuration = groupDuration\n }\n }\n }\n }\n\n return lowestDuration\n }\n\n checkUrlTriggers(\n sessionId: string,\n onPause: () => void,\n onResume: () => void,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): void {\n // V2 doesn't use the global onActivate callback - each group activates itself\n void onActivate\n\n // Check URL blocklist (global, not per-group)\n this._urlTriggerMatching.checkUrlBlocklist(onPause, onResume)\n\n // Check URL triggers for each group\n for (const matcher of this._triggerGroupMatchers) {\n matcher.checkUrlTriggerConditions(\n onPause,\n onResume,\n (triggerType) => {\n // Check group-level property filters before activating\n if (!this._checkGroupLevelProperties(matcher, undefined)) {\n return\n }\n\n matcher.activateTrigger(triggerType, sessionId)\n this.updateActiveTriggers(sessionId)\n this._onTriggerActivated()\n },\n sessionId\n )\n }\n }\n\n setupEventTriggerListeners(\n onEvent: (callback: (event: CaptureResult) => void) => () => void,\n sessionId: string,\n onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n ): (() => void) | undefined {\n // V2 doesn't use the global onActivate callback - each group activates itself\n void onActivate\n\n this._removeEventTriggerCaptureHook = onEvent((event: CaptureResult) => {\n // Performance optimization: Stop checking triggers after initial buffer flush\n if (this._hasCompletedInitialFlush) {\n logger.info('[SessionRecorder] Stopping trigger checks - initial buffer flushed')\n this._removeEventTriggerCaptureHook?.()\n this._removeEventTriggerCaptureHook = undefined\n return\n }\n\n try {\n // V2: Each group activates its own trigger with per-group persistence\n for (const matcher of this._triggerGroupMatchers) {\n matcher.checkEventTriggerConditions(\n event.event,\n (triggerType) => {\n // Check group-level property filters\n if (!this._checkGroupLevelProperties(matcher, event.properties)) {\n return\n }\n\n // Check per-event property filters.\n // A group may contain multiple entries for the same event name with\n // different property filters — e.g. \"purchase amount > 100\" OR\n // \"purchase by a VIP\". Treat same-name entries as a disjunction:\n // activate if *any* matching clause's filters pass. An entry with no\n // properties is treated as an unconditional match (matching V1).\n const matchedTriggers = (matcher.group.conditions.events || []).filter(\n (t) => t.name === event.event\n )\n const personProperties = this._instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const anyMatched = matchedTriggers.some(\n (t) =>\n !t.properties ||\n t.properties.length === 0 ||\n matchTriggerPropertyFilters(t.properties, event.properties, personProperties)\n )\n if (!anyMatched) {\n return\n }\n\n matcher.activateTrigger(triggerType, sessionId)\n this.updateActiveTriggers(sessionId)\n this._onTriggerActivated()\n },\n sessionId\n )\n }\n } catch (e) {\n logger.error('Could not activate event trigger for trigger groups', e)\n }\n })\n\n return this._removeEventTriggerCaptureHook\n }\n\n makeSamplingDecisions(sessionId: string): void {\n for (const matcher of this._triggerGroupMatchers) {\n const group = matcher.group\n const groupId = group.id\n const sampleRate = group.sampleRate\n\n // Check if we have a stored decision for this group\n const storageKey = SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX + groupId\n const storedValue = this._instance.get_property(storageKey)\n\n // Parse stored decision:\n // - object = current format with session ID, sample rate, and decision\n // - sessionId string = legacy sampled-in decision for that session\n // - false = legacy sampled-out decision without session/rate context (re-decide)\n // - undefined/null = no decision yet\n let storedDecision: boolean | null = null\n let sessionChanged = false\n let sampleRateChanged = false\n let sampledInWithoutStoredRate = false\n\n if (isObject(storedValue)) {\n const storedSessionId = storedValue.sessionId\n const storedSampleRate = storedValue.sampleRate\n const storedSampled = storedValue.sampled\n sessionChanged = typeof storedSessionId === 'string' && storedSessionId !== sessionId\n sampleRateChanged = isNumber(storedSampleRate) && storedSampleRate !== sampleRate\n storedDecision =\n storedSessionId === sessionId &&\n isNumber(storedSampleRate) &&\n storedSampleRate === sampleRate &&\n isBoolean(storedSampled)\n ? storedSampled\n : null\n } else {\n storedDecision = storedValue === sessionId ? true : null\n sessionChanged = typeof storedValue === 'string' && storedValue !== sessionId\n sampledInWithoutStoredRate = storedValue === sessionId\n }\n\n // Make new decision only if:\n // 1. No stored decision exists (storedDecision is null/undefined), OR\n // 2. Session changed (stored sessionId doesn't match current), OR\n // 3. Sample rate changed since the stored decision was made\n const makeDecision =\n sessionChanged || sampleRateChanged || sampledInWithoutStoredRate || !isBoolean(storedDecision)\n const shouldSample = makeDecision ? sampleOnProperty(sessionId + groupId, sampleRate) : storedDecision!\n\n if (makeDecision) {\n this._tryAddCustomEvent('triggerGroupSamplingDecisionMade', {\n group_id: groupId,\n group_name: group.name,\n sampleRate: sampleRate,\n isSampled: shouldSample,\n })\n }\n\n // Store the decision\n this._triggerGroupSamplingResults.set(groupId, shouldSample)\n this._instance.persistence?.register({\n [storageKey]: {\n sessionId,\n sampleRate,\n sampled: shouldSample,\n },\n })\n }\n\n // After all sampling decisions, register which groups are actively recording\n this.updateActiveTriggers(sessionId)\n }\n\n ensureSamplingDecision(sessionId: string): void {\n // V2 sampling is per trigger group and safe by default — a missing group\n // decision reads as not sampled, so it can never leak an undecided flush\n void sessionId\n }\n\n onFlushComplete(): void {\n this._hasCompletedInitialFlush = true\n }\n\n clearConditionalRecordingPersistence(): void {\n this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n this._instance.persistence?.unregister(SESSION_RECORDING_SAMPLE_RATE)\n this._instance.persistence?.unregister(SESSION_RECORDING_PAST_MINIMUM_DURATION)\n\n // V2: Clear per-group trigger keys\n for (const matcher of this._triggerGroupMatchers) {\n const groupId = matcher.group.id\n this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX + groupId)\n this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX + groupId)\n this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX + groupId)\n }\n }\n\n updateActiveTriggers(sessionId: string): void {\n const recordingGroups: Array<{ id: string; name: string; matched: boolean; sampled: boolean }> = []\n\n for (const matcher of this._triggerGroupMatchers) {\n const group = matcher.group\n const groupId = group.id\n const triggerStatus = matcher.triggerStatus(sessionId)\n const isMatched = triggerStatus === 'trigger_activated'\n const isSampled = this._triggerGroupSamplingResults.get(groupId) === true\n\n if (isMatched) {\n recordingGroups.push({\n id: groupId,\n name: group.name,\n matched: true,\n sampled: isSampled,\n })\n }\n }\n\n this._instance.register_for_session({\n [SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS]: recordingGroups,\n })\n }\n\n hasPendingTriggers(sessionId: string): boolean {\n // V2: Check if any group has pending triggers\n for (const matcher of this._triggerGroupMatchers) {\n if (matcher.triggerStatus(sessionId) === TRIGGER_PENDING) {\n return true\n }\n }\n return false\n }\n\n stop(): void {\n this._removeEventTriggerCaptureHook?.()\n this._removeEventTriggerCaptureHook = undefined\n this._triggerGroupMatchers.forEach((matcher) => matcher.stop())\n this._triggerGroupMatchers = []\n this._triggerGroupSamplingResults.clear()\n this._urlTriggerMatching.stop()\n }\n\n private _checkGroupLevelProperties(\n matcher: TriggerGroupMatching,\n eventProperties: Record<string, any> | undefined\n ): boolean {\n const groupProperties = matcher.group.conditions.properties\n if (!groupProperties || groupProperties.length === 0) {\n return true\n }\n const personProperties = this._instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n return matchTriggerPropertyFilters(groupProperties, eventProperties, personProperties)\n }\n\n private _setupTriggerGroups(groups: SessionRecordingTriggerGroup[]) {\n // Clean up existing matchers\n this._triggerGroupMatchers.forEach((matcher) => matcher.stop())\n this._triggerGroupMatchers = []\n this._triggerGroupSamplingResults.clear()\n\n // Create a matcher for each group\n for (const group of groups) {\n const matcher = new TriggerGroupMatching(this._instance, group, (flag, variant) => {\n this._reportStarted('linked_flag_matched', {\n flag,\n variant,\n group_id: group.id,\n group_name: group.name,\n })\n this._onTriggerActivated()\n })\n this._triggerGroupMatchers.push(matcher)\n }\n }\n}\n","import type { recordOptions, rrwebRecord as rrwebRecordType } from '../types/rrweb'\nimport {\n type customEvent,\n EventType,\n eventWithTime,\n type fullSnapshotEvent,\n IncrementalSource,\n type listenerHandler,\n RecordPlugin,\n} from '../types/rrweb-types'\nimport { buildNetworkRequestOptions } from './config'\nimport {\n ACTIVE,\n BUFFERING,\n DISABLED,\n EventTriggerMatching,\n LinkedFlagMatching,\n PAUSED,\n SessionRecordingStatus,\n TriggerType,\n URLTriggerMatching,\n} from './triggerMatching'\nimport {\n circularReferenceReplacer,\n estimateCompressedEventSize,\n estimateSize,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n splitBuffer,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nexport { SEVEN_MEGABYTES, splitBuffer } from './sessionrecording-utils'\nimport { gzipSync, strFromU8, strToU8 } from 'fflate'\nimport { window, document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow, LazyLoadedSessionRecordingInterface } from '../../../utils/globals'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { MutationThrottler } from './mutation-throttler'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport {\n clampToRange,\n gzipCompress,\n isArray,\n isBoolean,\n isFunction,\n isGzipSupported,\n isNull,\n isNullish,\n isNativeAsyncGzipError,\n isNumber,\n isObject,\n isUndefined,\n stripUrlHash,\n} from '@posthog/core'\nimport {\n SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP,\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_SAMPLE_RATE,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_PAST_MINIMUM_DURATION,\n SESSION_RECORDING_REMOTE_CONFIG,\n SESSION_RECORDING_START_REASON,\n SDK_DEBUG_REPLAY_RRWEB_ATTACHED,\n SDK_DEBUG_REPLAY_RRWEB_START_ATTEMPTED,\n SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport {\n NetworkRecordOptions,\n PerformanceCaptureConfig,\n Properties,\n SessionIdChangedCallback,\n SessionRecordingOptions,\n SessionRecordingPersistedConfig,\n SessionStartReason,\n} from '../../../types'\nimport { isLocalhost, maskQueryParams } from '@posthog/browser-common/utils/request-utils'\nimport Config from '../../../config'\nimport { FlushedSizeTracker } from './flushed-size-tracker'\nimport {\n RecordingStrategy,\n V1RecordingStrategy,\n V2TriggerGroupStrategy,\n RecordingStrategyContext,\n decodeSamplingDecision,\n} from './recording-strategies'\nimport { MASKED, PERSONAL_DATA_CAMPAIGN_PARAMS } from '@posthog/browser-common/utils/event-utils'\n\nconst BASE_ENDPOINT = '/s/'\nconst DEFAULT_CANVAS_QUALITY = 0.4\nconst DEFAULT_CANVAS_FPS = 4\nconst MAX_CANVAS_FPS = 12\nconst MAX_CANVAS_QUALITY = 1\n\n// lower bound for session_recording.canvasCapture.resolutionScale, so a misconfiguration can't\n// capture at a degenerate resolution.\nconst MIN_CANVAS_SCALE = 0.1\nconst TWO_SECONDS = 2000\nconst ONE_KB = 1024\n\nconst ONE_MINUTE = 1000 * 60\nconst FIVE_MINUTES = ONE_MINUTE * 5\nconst ONE_HOUR = ONE_MINUTE * 60\nconst MIN_TRIGGER_PENDING_BUFFER_INTERVAL_MILLIS = 1000\nconst MAX_TRIGGER_PENDING_BUFFER_INTERVAL_MILLIS = ONE_HOUR\n\n/**\n * Extracts the network_timing value from a capturePerformance config.\n * Returns `true`/`false` if explicitly set, or `undefined` if not specified.\n */\nfunction networkTimingFromConfig(config: boolean | PerformanceCaptureConfig | undefined): boolean | undefined {\n return isObject(config) ? config.network_timing : config\n}\n\nexport const RECORDING_IDLE_THRESHOLD_MS = FIVE_MINUTES\nexport const RECORDING_REMOTE_CONFIG_TTL_MS = ONE_HOUR\nexport const RECORDING_MAX_EVENT_SIZE = ONE_KB * ONE_KB * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'recordings'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\ninterface QueuedRRWebEvent {\n rrwebMethod: () => void\n attempt: number\n // the timestamp this was first put into this queue\n enqueuedAt: number\n}\n\ninterface QueuedCompressionEvent {\n event: eventWithTime\n compressionEnabled: boolean\n targetSessionId: string\n targetWindowId: string\n generation: number\n processed: boolean\n counted: boolean\n}\n\ninterface SessionIdlePayload {\n eventTimestamp: number\n lastActivityTimestamp: number\n threshold: number\n bufferLength: number\n bufferSize: number\n}\n\nexport interface SnapshotBuffer {\n size: number\n data: any[]\n sizes: number[]\n sessionId: string\n windowId: string\n}\n\nconst ACTIVE_SOURCES: IncrementalSource[] = [\n IncrementalSource.MouseMove,\n IncrementalSource.MouseInteraction,\n IncrementalSource.Scroll,\n IncrementalSource.ViewportResize,\n IncrementalSource.Input,\n IncrementalSource.TouchMove,\n IncrementalSource.MediaInteraction,\n IncrementalSource.Drag,\n]\n\nconst newQueuedEvent = (rrwebMethod: () => void): QueuedRRWebEvent => ({\n rrwebMethod,\n enqueuedAt: Date.now(),\n attempt: 1,\n})\n\nfunction getRRWeb() {\n return assignableWindow?.__PosthogExtensions__?.rrweb\n}\n\nfunction getRRWebRecord(): rrwebRecordType | undefined {\n return getRRWeb()?.record\n}\n\nexport type compressedFullSnapshotEvent = {\n type: typeof EventType.FullSnapshot\n data: string\n}\n\nexport type compressedIncrementalSnapshotEvent = {\n type: typeof EventType.IncrementalSnapshot\n data: {\n source: IncrementalSource\n texts: string\n attributes: string\n removes: string\n adds: string\n }\n}\n\nexport type compressedIncrementalStyleSnapshotEvent = {\n type: typeof EventType.IncrementalSnapshot\n data: {\n source: typeof IncrementalSource.StyleSheetRule\n id?: number\n styleId?: number\n replace?: string\n replaceSync?: string\n adds?: string\n removes?: string\n }\n}\n\nexport type compressedEvent =\n | compressedIncrementalStyleSnapshotEvent\n | compressedFullSnapshotEvent\n | compressedIncrementalSnapshotEvent\nexport type compressedEventWithTime = compressedEvent & {\n timestamp: number\n delay?: number\n // marker for compression version\n cv: '2024-10'\n}\n\nfunction gzipStringToString(serializedData: string): string {\n return strFromU8(gzipSync(strToU8(serializedData)), true)\n}\n\nfunction serializeForCompression(data: unknown): string {\n try {\n // fast path: plain native stringify, since a replacer callback is expensive on\n // large snapshots and circular event data is rare\n return JSON.stringify(data)\n } catch {\n // circular event data (e.g. a leaked instance graph) degrades gracefully to\n // '[Circular]' markers instead of throwing, the same two-step approach as jsonStringify\n return JSON.stringify(data, circularReferenceReplacer())\n }\n}\n\nfunction gzipToString(data: unknown): string {\n return gzipStringToString(serializeForCompression(data))\n}\n\nasync function gzipToStringAsync(data: unknown): Promise<string> {\n const serializedData = serializeForCompression(data)\n const compressed = await gzipCompress(serializedData, Config.DEBUG, { rethrow: true })\n return strFromU8(new Uint8Array(await compressed!.arrayBuffer()), true)\n}\n\nlet _gzippedEmptyArray: string | undefined\nlet _gzippedEmptyArrayPromise: Promise<string> | undefined\nconst _isNativeAsyncSessionRecordingGzipSupported = typeof globalThis !== 'undefined' && isGzipSupported()\nlet _nativeAsyncSessionRecordingGzipDisabled = false\n\nfunction gzipField(data: unknown): string {\n if (isArray(data) && data.length === 0) {\n _gzippedEmptyArray = _gzippedEmptyArray ?? gzipToString([])\n return _gzippedEmptyArray\n }\n return gzipToString(data)\n}\n\nasync function gzipFieldAsync(data: unknown): Promise<string> {\n if (isArray(data) && data.length === 0) {\n if (_gzippedEmptyArray) {\n return _gzippedEmptyArray\n }\n _gzippedEmptyArrayPromise =\n _gzippedEmptyArrayPromise ??\n gzipToStringAsync([])\n .then((compressed) => {\n _gzippedEmptyArray = compressed\n return compressed\n })\n .catch((error) => {\n _gzippedEmptyArray = undefined\n _gzippedEmptyArrayPromise = undefined\n throw error\n })\n return _gzippedEmptyArrayPromise\n }\n return gzipToStringAsync(data)\n}\n\nfunction shouldCompressEvent(event: eventWithTime): boolean {\n return (\n event.type === EventType.FullSnapshot ||\n (event.type === EventType.IncrementalSnapshot &&\n (event.data.source === IncrementalSource.Mutation ||\n event.data.source === IncrementalSource.StyleSheetRule))\n )\n}\n\nfunction shouldUseNativeAsyncSessionRecordingGzip(event: eventWithTime): boolean {\n return (\n _isNativeAsyncSessionRecordingGzipSupported &&\n !_nativeAsyncSessionRecordingGzipDisabled &&\n shouldCompressEvent(event)\n )\n}\n\ntype CompressedEventResult = { event: eventWithTime | compressedEventWithTime; size: number }\n\ntype CompressedMutationFields = Pick<\n compressedIncrementalSnapshotEvent['data'],\n 'texts' | 'attributes' | 'removes' | 'adds'\n>\ntype CompressedStyleFields = Pick<compressedIncrementalStyleSnapshotEvent['data'], 'adds' | 'removes'>\n\nfunction compressedResult(event: compressedEventWithTime): CompressedEventResult {\n return { event, size: estimateCompressedEventSize(event) }\n}\n\nfunction buildCompressedFullSnapshotEvent(\n event: fullSnapshotEvent & { timestamp: number; delay?: number },\n data: string\n): compressedEventWithTime {\n return {\n ...event,\n data,\n cv: '2024-10',\n }\n}\n\nfunction buildCompressedIncrementalEvent(\n event: eventWithTime,\n fields: CompressedMutationFields | CompressedStyleFields\n): compressedEventWithTime {\n // reshapes rrweb incremental `data` into its compressed string-field variant — the\n // compiler cannot relate the incoming union member to the matching compressed member\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n ...event,\n cv: '2024-10' as const,\n data: {\n ...(event.data as Record<string, unknown>),\n ...fields,\n },\n } as compressedEventWithTime\n}\n\n/**\n * rrweb's packer takes an event and returns a string or the reverse on `unpack`.\n * but we want to be able to inspect metadata during ingestion.\n * and don't want to compress the entire event,\n * so we have a custom packer that only compresses part of some events\n *\n * returns the compressed event and its estimated JSON size,\n * avoiding a redundant JSON.stringify for size estimation\n */\nfunction compressEventSync(event: eventWithTime): CompressedEventResult {\n try {\n if (event.type === EventType.FullSnapshot) {\n return compressedResult(buildCompressedFullSnapshotEvent(event, gzipToString(event.data)))\n }\n if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.Mutation) {\n return compressedResult(\n buildCompressedIncrementalEvent(event, {\n texts: gzipField(event.data.texts),\n attributes: gzipField(event.data.attributes),\n removes: gzipField(event.data.removes),\n adds: gzipField(event.data.adds),\n })\n )\n }\n if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.StyleSheetRule) {\n return compressedResult(\n buildCompressedIncrementalEvent(event, {\n adds: event.data.adds ? gzipToString(event.data.adds) : undefined,\n removes: event.data.removes ? gzipToString(event.data.removes) : undefined,\n })\n )\n }\n } catch (e) {\n logger.error('could not compress event - will use uncompressed event', e)\n }\n return { event, size: estimateSize(event) }\n}\n\nasync function compressEventAsync(event: eventWithTime): Promise<CompressedEventResult> {\n try {\n if (event.type === EventType.FullSnapshot) {\n return compressedResult(buildCompressedFullSnapshotEvent(event, await gzipToStringAsync(event.data)))\n }\n if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.Mutation) {\n const [texts, attributes, removes, adds] = await Promise.all([\n gzipFieldAsync(event.data.texts),\n gzipFieldAsync(event.data.attributes),\n gzipFieldAsync(event.data.removes),\n gzipFieldAsync(event.data.adds),\n ])\n return compressedResult(buildCompressedIncrementalEvent(event, { texts, attributes, removes, adds }))\n }\n if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.StyleSheetRule) {\n const [adds, removes] = await Promise.all([\n event.data.adds ? gzipToStringAsync(event.data.adds) : undefined,\n event.data.removes ? gzipToStringAsync(event.data.removes) : undefined,\n ])\n return compressedResult(buildCompressedIncrementalEvent(event, { adds, removes }))\n }\n } catch (e) {\n if (isNativeAsyncGzipError(e)) {\n _nativeAsyncSessionRecordingGzipDisabled = true\n }\n logger.error('could not compress event asynchronously - trying synchronous compression', e)\n return compressEventSync(event)\n }\n return { event, size: estimateSize(event) }\n}\n\nfunction isCustomEvent(e: eventWithTime, tag: string): e is eventWithTime & customEvent {\n return e.type === EventType.Custom && e.data.tag === tag\n}\n\nfunction isSessionIdleEvent(e: eventWithTime): e is eventWithTime & customEvent {\n return isCustomEvent(e, 'sessionIdle')\n}\n\ntype SessionEndingPayload = {\n lastActivityTimestamp?: number\n currentSessionId?: string\n currentWindowId?: string\n}\n\nfunction isSessionEndingEvent(e: eventWithTime): e is eventWithTime & customEvent {\n return isCustomEvent(e, '$session_ending')\n}\n\nfunction getSessionEndingPayload(e: eventWithTime): SessionEndingPayload | null {\n return isSessionEndingEvent(e) ? (e.data.payload as SessionEndingPayload) : null\n}\n\ntype SessionStartingPayload = {\n lastActivityTimestamp?: number\n nextSessionId?: string\n nextWindowId?: string\n}\n\nfunction isSessionStartingEvent(e: eventWithTime): e is eventWithTime & customEvent {\n return isCustomEvent(e, '$session_starting')\n}\n\nfunction getSessionStartingPayload(e: eventWithTime): SessionStartingPayload | null {\n return isSessionStartingEvent(e) ? (e.data.payload as SessionStartingPayload) : null\n}\n\nfunction isAllowedWhenIdle(e: eventWithTime): boolean {\n return isSessionIdleEvent(e) || isSessionEndingEvent(e) || isSessionStartingEvent(e)\n}\n\n/** When we put the recording into a paused state, we add a custom event.\n * However, in the paused state, events are dropped and never make it to the buffer,\n * so we need to manually let this one through */\nfunction isRecordingPausedEvent(e: eventWithTime) {\n return e.type === EventType.Custom && e.data.tag === 'recording paused'\n}\n\nexport class LazyLoadedSessionRecording implements LazyLoadedSessionRecordingInterface {\n private _endpoint: string = BASE_ENDPOINT\n private _mutationThrottler?: MutationThrottler\n /**\n * Util to help developers working on this feature manually override\n */\n private _forceAllowLocalhostNetworkCapture = false\n private _stopRrweb: listenerHandler | undefined = undefined\n private _lastActivityTimestamp: number = Date.now()\n private _isActivatingTrigger: boolean = false\n /**\n * if pageview capture is disabled,\n * then we can manually track href changes\n */\n private _lastHref?: string\n /**\n * and a queue - that contains rrweb events that we want to send to rrweb, but rrweb wasn't able to accept them yet\n */\n private _queuedRRWebEvents: QueuedRRWebEvent[] = []\n private _isIdle: boolean | 'unknown' = 'unknown'\n private _rrwebError = false\n private _rrwebStartAttempted = false\n private _maxDepthExceeded = false\n // only warn once per recorder instance that client-side masking is shadowing the project setting\n private _hasWarnedClientMaskingOverride = false\n\n private _linkedFlagMatching: LinkedFlagMatching\n private _urlTriggerMatching: URLTriggerMatching\n private _eventTriggerMatching: EventTriggerMatching\n // Strategy pattern: V1 vs V2 trigger logic\n private _strategy: RecordingStrategy | undefined\n private _fullSnapshotTimer?: ReturnType<typeof setInterval>\n private _fullSnapshotTimestamps: Array<[string, number]> = []\n // ship-time FullSnapshot tracking for _ensureFullSnapshotForSession (unlike _fullSnapshotTimestamps, which records emit-time debug telemetry)\n private _lastFullSnapshotSessionId: string | undefined = undefined\n private _fullSnapshotHealAttemptedFor: string | undefined = undefined\n\n private _windowId: string\n private _sessionId: string\n get sessionId(): string {\n return this._sessionId\n }\n\n private _flushBufferTimer?: any\n // we have a buffer - that contains PostHog snapshot events ready to be sent to the server\n private _buffer: SnapshotBuffer\n private _compressionQueue?: Promise<void>\n private _pendingCompressionEvents: QueuedCompressionEvent[] = []\n private _queuedCompressionEvents: number = 0\n private _compressionQueueGeneration: number = 0\n private _isStoppingAfterCompression: boolean = false\n\n private _removePageViewCaptureHook: (() => void) | undefined = undefined\n\n private _removeEventTriggerCaptureHook: (() => void) | undefined = undefined\n\n private _flushedSizeTracker: FlushedSizeTracker\n\n private get _sessionManager() {\n if (!this._instance.sessionManager) {\n throw new Error(LOGGER_PREFIX + ' must be started with a valid sessionManager.')\n }\n\n return this._instance.sessionManager\n }\n\n private get _sessionIdleThresholdMilliseconds(): number {\n return this._instance.config.session_recording.session_idle_threshold_ms || RECORDING_IDLE_THRESHOLD_MS\n }\n\n private get _isSampled(): boolean | null {\n const currentValue = this._instance.get_property(SESSION_RECORDING_IS_SAMPLED)\n // anything but this session's own tagged decision decodes to null, forcing a fresh decision\n return decodeSamplingDecision(currentValue, this.sessionId)\n }\n\n private get _sampleRate(): number | null {\n const rate = this._remoteConfig?.sampleRate\n return isNumber(rate) ? rate : null\n }\n\n private get _minimumDuration(): number | null {\n return this._strategy?.getMinimumDuration(this.sessionId) ?? null\n }\n\n private _onSessionIdListener: (() => void) | undefined = undefined\n private _onSessionIdleResetForcedListener: (() => void) | undefined = undefined\n private _forceIdleSessionIdListener: (() => void) | undefined = undefined\n\n constructor(private readonly _instance: PostHog) {\n // we know there's a sessionManager, so don't need to start without a session id\n const { sessionId, windowId } = this._sessionManager.checkAndGetSessionAndWindowId()\n this._sessionId = sessionId\n this._windowId = windowId\n\n this._linkedFlagMatching = new LinkedFlagMatching(this._instance)\n this._urlTriggerMatching = new URLTriggerMatching(this._instance)\n this._eventTriggerMatching = new EventTriggerMatching(this._instance)\n\n this._buffer = this._clearBuffer()\n\n if (this._sessionIdleThresholdMilliseconds >= this._sessionManager.sessionTimeoutMs) {\n logger.warn(\n `session_idle_threshold_ms (${this._sessionIdleThresholdMilliseconds}) is greater than the session timeout (${this._sessionManager.sessionTimeoutMs}). Session will never be detected as idle`\n )\n }\n\n this._flushedSizeTracker = new FlushedSizeTracker(this._instance)\n }\n\n private get _masking():\n | Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>\n | undefined {\n const masking_server_side = this._remoteConfig?.masking\n const masking_client_side = {\n maskAllInputs: this._instance.config.session_recording?.maskAllInputs,\n maskTextSelector: this._instance.config.session_recording?.maskTextSelector,\n blockSelector: this._instance.config.session_recording?.blockSelector,\n }\n\n const maskAllInputs = masking_client_side?.maskAllInputs ?? masking_server_side?.maskAllInputs\n const maskTextSelector = masking_client_side?.maskTextSelector ?? masking_server_side?.maskTextSelector\n const blockSelector = masking_client_side?.blockSelector ?? masking_server_side?.blockSelector\n\n return !isUndefined(maskAllInputs) || !isUndefined(maskTextSelector) || !isUndefined(blockSelector)\n ? {\n maskAllInputs: maskAllInputs ?? true,\n maskTextSelector,\n blockSelector,\n }\n : undefined\n }\n\n /**\n * Client-side masking config in `posthog.init` intentionally wins over the \"Privacy and masking\"\n * project setting (the remote config). That precedence is by-design, but silent: a developer who\n * sets e.g. `maskTextSelector: '*'` locally can be surprised that their dashboard setting has no\n * effect. Warn (once per recorder) when the two diverge so the override is self-explaining.\n */\n private _warnIfClientMaskingShadowsServer(): void {\n if (this._hasWarnedClientMaskingOverride) {\n return\n }\n\n const masking_server_side = this._remoteConfig?.masking\n if (isNullish(masking_server_side)) {\n return\n }\n\n const clientConfig = this._instance.config.session_recording\n const divergentFields = (['maskAllInputs', 'maskTextSelector', 'blockSelector'] as const).filter((field) => {\n const clientValue = clientConfig?.[field]\n const serverValue = masking_server_side[field]\n // a client value that is set and disagrees with the project's value shadows it — an unset\n // server value counts as a divergence too, since the client is then masking something the\n // project setting did not ask for (e.g. maskTextSelector: '*' vs an unset project selector)\n return !isUndefined(clientValue) && clientValue !== serverValue\n })\n\n if (divergentFields.length === 0) {\n return\n }\n\n this._hasWarnedClientMaskingOverride = true\n logger.warn(\n 'Session recording masking is configured both in `posthog.init` and in your project settings, and they differ. ' +\n 'The `session_recording` options in `posthog.init` take precedence, so the project (\"Privacy and masking\") setting is ignored for: ' +\n divergentFields.join(', ') +\n '. Remove these masking options from `posthog.init` to use the project setting instead. ' +\n 'See https://posthog.com/docs/session-replay/privacy',\n {\n client: {\n maskAllInputs: clientConfig?.maskAllInputs,\n maskTextSelector: clientConfig?.maskTextSelector,\n blockSelector: clientConfig?.blockSelector,\n },\n project: masking_server_side,\n }\n )\n }\n\n // (0,1] fraction of the canvas display size to capture frames at, from\n // session_recording.canvasCapture.resolutionScale. clamped to [MIN_CANVAS_SCALE, 1]; defaults\n // to 1 (full resolution) so capture only drops below full resolution when explicitly\n // configured. replay upscales the frame back to its display size.\n private get _canvasResolutionScale(): number {\n return clampToRange(\n this._instance.config.session_recording.canvasCapture?.resolutionScale,\n MIN_CANVAS_SCALE,\n 1,\n createLogger('canvas recording resolution scale'),\n 1\n )\n }\n\n private get _canvasRecording(): { enabled: boolean; fps: number; quality: number } {\n const canvasRecording_client_side = this._instance.config.session_recording.captureCanvas\n const canvasRecording_server_side = this._remoteConfig?.canvasRecording\n\n const enabled: boolean =\n canvasRecording_client_side?.recordCanvas ?? canvasRecording_server_side?.enabled ?? false\n const fps: number =\n canvasRecording_client_side?.canvasFps ?? canvasRecording_server_side?.fps ?? DEFAULT_CANVAS_FPS\n let quality: string | number =\n canvasRecording_client_side?.canvasQuality ?? canvasRecording_server_side?.quality ?? DEFAULT_CANVAS_QUALITY\n if (typeof quality === 'string') {\n const parsed = parseFloat(quality)\n quality = isNaN(parsed) ? 0.4 : parsed\n }\n\n return {\n enabled,\n fps: clampToRange(fps, 0, MAX_CANVAS_FPS, createLogger('canvas recording fps'), DEFAULT_CANVAS_FPS),\n quality: clampToRange(\n quality,\n 0,\n MAX_CANVAS_QUALITY,\n createLogger('canvas recording quality'),\n DEFAULT_CANVAS_QUALITY\n ),\n }\n }\n\n private get _isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this._remoteConfig?.consoleLogRecordingEnabled\n const enabled_client_side = this._instance.config.enable_recording_console_log\n return enabled_client_side ?? enabled_server_side\n }\n\n // network payload capture config has three parts\n // each can be configured server side or client side\n private get _networkPayloadCapture():\n | Pick<NetworkRecordOptions, 'recordHeaders' | 'recordBody' | 'recordPerformance'>\n | undefined {\n const networkPayloadCapture_server_side = this._remoteConfig?.networkPayloadCapture\n const networkPayloadCapture_client_side = {\n recordHeaders: this._instance.config.session_recording?.recordHeaders,\n recordBody: this._instance.config.session_recording?.recordBody,\n }\n const headersEnabled =\n networkPayloadCapture_client_side?.recordHeaders || networkPayloadCapture_server_side?.recordHeaders\n const bodyEnabled =\n networkPayloadCapture_client_side?.recordBody || networkPayloadCapture_server_side?.recordBody\n const clientNetworkTiming = networkTimingFromConfig(this._instance.config.capture_performance)\n const serverNetworkTiming = networkTimingFromConfig(networkPayloadCapture_server_side?.capturePerformance)\n const networkTimingEnabled = !!(isBoolean(clientNetworkTiming) ? clientNetworkTiming : serverNetworkTiming)\n\n return headersEnabled || bodyEnabled || networkTimingEnabled\n ? { recordHeaders: headersEnabled, recordBody: bodyEnabled, recordPerformance: networkTimingEnabled }\n : undefined\n }\n\n private _gatherRRWebPlugins() {\n const plugins: RecordPlugin[] = []\n\n const recordConsolePlugin = assignableWindow.__PosthogExtensions__?.rrwebPlugins?.getRecordConsolePlugin\n if (recordConsolePlugin && this._isConsoleLogCaptureEnabled) {\n plugins.push(recordConsolePlugin())\n }\n\n const networkPlugin = assignableWindow.__PosthogExtensions__?.rrwebPlugins?.getRecordNetworkPlugin\n if (!!this._networkPayloadCapture && isFunction(networkPlugin)) {\n const canRecordNetwork = !isLocalhost() || this._forceAllowLocalhostNetworkCapture\n\n if (canRecordNetwork) {\n plugins.push(\n networkPlugin(buildNetworkRequestOptions(this._instance.config, this._networkPayloadCapture))\n )\n } else {\n logger.info('NetworkCapture not started because we are on localhost.')\n }\n }\n\n return plugins\n }\n\n private _stripUrlHash(url: string): string {\n return this._instance.config.disable_capture_url_hashes ? stripUrlHash(url) : url\n }\n\n private _maskReplayUrl(url: string, forceStripHash: boolean = false): string | undefined {\n const href = forceStripHash ? stripUrlHash(url) : this._stripUrlHash(url)\n const paramsToMask = this._instance.config.mask_personal_data_properties\n ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(this._instance.config.custom_personal_data_properties || [])]\n : []\n\n return this._maskUrl(maskQueryParams(href, paramsToMask, MASKED))\n }\n\n private _maskUrl(url: string): string | undefined {\n const userSessionRecordingOptions = this._instance.config.session_recording\n\n // userSessionRecordingOptions.maskNetworkRequestFn is deprecated, fallback to it\n if (userSessionRecordingOptions.maskCapturedNetworkRequestFn) {\n const result = userSessionRecordingOptions.maskCapturedNetworkRequestFn({\n name: url,\n } as any)\n // CapturedNetworkRequest uses 'name' for URL, but also check 'url' for compatibility\n return result?.name ?? (result as any)?.url\n }\n\n if (userSessionRecordingOptions.maskNetworkRequestFn) {\n const result = userSessionRecordingOptions.maskNetworkRequestFn({\n url,\n })\n return result?.url\n }\n\n return url\n }\n\n private _tryRRWebMethod(queuedRRWebEvent: QueuedRRWebEvent): boolean {\n try {\n queuedRRWebEvent.rrwebMethod()\n return true\n } catch (e) {\n // Sometimes a race can occur where the recorder is not fully started yet\n if (this._queuedRRWebEvents.length < 10) {\n this._queuedRRWebEvents.push({\n enqueuedAt: queuedRRWebEvent.enqueuedAt || Date.now(),\n attempt: queuedRRWebEvent.attempt + 1,\n rrwebMethod: queuedRRWebEvent.rrwebMethod,\n })\n } else {\n logger.warn('could not emit queued rrweb event.', e, queuedRRWebEvent)\n }\n\n return false\n }\n }\n\n private _tryAddCustomEvent(tag: string, payload: any): boolean {\n return this._tryRRWebMethod(newQueuedEvent(() => getRRWebRecord()!.addCustomEvent(tag, payload)))\n }\n\n private _pageViewFallBack() {\n try {\n if (this._instance.config.capture_pageview || !window) {\n return\n }\n // Preserve the previous normalization behavior for this fallback (e.g. https://test.com -> https://test.com/)\n // while still applying query masking. This path was already hashless before disable_capture_url_hashes.\n // eslint-disable-next-line compat/compat\n const url = new URL(window.location.href)\n const currentUrl = this._maskReplayUrl(url.origin + url.pathname + url.search)\n if (this._lastHref !== currentUrl) {\n this._lastHref = currentUrl\n this._tryAddCustomEvent('$url_changed', { href: currentUrl })\n }\n } catch {\n // If URL processing fails, don't capture anything\n }\n }\n\n private _processQueuedEvents() {\n if (this._queuedRRWebEvents.length) {\n // if rrweb isn't ready to accept events earlier, then we queued them up.\n // now that `emit` has been called rrweb should be ready to accept them.\n // so, before we process this event, we try our queued events _once_ each\n // we don't want to risk queuing more things and never exiting this loop!\n // if they fail here, they'll be pushed into a new queue\n // and tried on the next loop.\n // there is a risk of this queue growing in an uncontrolled manner.\n // so its length is limited elsewhere\n // for now this is to help us ensure we can capture events that happen\n // and try to identify more about when it is failing\n const itemsToProcess = [...this._queuedRRWebEvents]\n this._queuedRRWebEvents = []\n itemsToProcess.forEach((queuedRRWebEvent) => {\n if (Date.now() - queuedRRWebEvent.enqueuedAt <= TWO_SECONDS) {\n this._tryRRWebMethod(queuedRRWebEvent)\n }\n })\n }\n }\n\n private _tryTakeFullSnapshot(): boolean {\n return this._tryRRWebMethod(newQueuedEvent(() => getRRWebRecord()!.takeFullSnapshot()))\n }\n\n private get _fullSnapshotIntervalMillis(): number {\n if (this._strategy?.hasPendingTriggers(this.sessionId) && !['sampled', 'active'].includes(this.status)) {\n const configuredInterval = this._instance.config.session_recording?.trigger_pending_buffer_interval_millis\n return isNumber(configuredInterval) &&\n Number.isFinite(configuredInterval) &&\n configuredInterval >= MIN_TRIGGER_PENDING_BUFFER_INTERVAL_MILLIS &&\n configuredInterval <= MAX_TRIGGER_PENDING_BUFFER_INTERVAL_MILLIS\n ? configuredInterval\n : ONE_MINUTE\n }\n\n return this._instance.config.session_recording?.full_snapshot_interval_millis ?? FIVE_MINUTES\n }\n\n private _scheduleFullSnapshot(): void {\n if (this._fullSnapshotTimer) {\n clearInterval(this._fullSnapshotTimer)\n }\n // we don't schedule snapshots while idle\n if (this._isIdle === true) {\n return\n }\n\n const interval = this._fullSnapshotIntervalMillis\n if (!interval) {\n return\n }\n\n this._fullSnapshotTimer = setInterval(() => {\n this._tryTakeFullSnapshot()\n }, interval)\n }\n\n private _onTriggerActivated(): void {\n if (this._urlTriggerMatching.urlBlocked || !['sampled', 'active'].includes(this.status)) {\n return\n }\n this._scheduleFullSnapshot()\n }\n\n private _pauseRecording() {\n // we check _urlBlocked not status, since more than one thing can affect status\n if (this._urlTriggerMatching.urlBlocked) {\n return\n }\n\n // we can't flush the buffer here since someone might be starting on a blocked page.\n // and we need to be sure that we don't record that page,\n // so we might not get the below custom event, but events will report the paused status.\n // which will allow debugging of sessions that start on blocked pages\n this._urlTriggerMatching.urlBlocked = true\n\n // Clear the snapshot timer since we don't want new snapshots while paused\n clearInterval(this._fullSnapshotTimer)\n\n logger.info('recording paused due to URL blocker')\n this._tryAddCustomEvent('recording paused', { reason: 'url blocker' })\n }\n\n private _resumeRecording() {\n // we check _urlBlocked not status, since more than one thing can affect status\n if (!this._urlTriggerMatching.urlBlocked) {\n return\n }\n\n this._urlTriggerMatching.urlBlocked = false\n\n this._tryTakeFullSnapshot()\n this._scheduleFullSnapshot()\n\n this._tryAddCustomEvent('recording resumed', { reason: 'left blocked url' })\n logger.info('recording resumed')\n }\n\n private _activateTrigger(triggerType: TriggerType, matchDetail?: string) {\n // V1 only: V2 uses per-group activation and never calls this method\n // Prevent re-entry: if we're already activating a trigger, skip to avoid infinite recursion\n // This can happen when _reportStarted emits custom events that match the trigger condition\n if (this._isActivatingTrigger) {\n return\n }\n\n if (!this._strategy?.hasPendingTriggers(this.sessionId)) {\n return\n }\n\n this._isActivatingTrigger = true\n try {\n // V1: Write trigger activation to persistence\n // (V2 handles this per-group via TriggerGroupMatching.activateTrigger)\n const persistenceKey =\n triggerType === 'url'\n ? SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION\n : SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION\n\n this._instance.persistence?.register({\n [persistenceKey]: this.sessionId,\n })\n\n this._strategy?.updateActiveTriggers(this.sessionId)\n this._onTriggerActivated()\n\n this._flushBuffer()\n this._reportStarted((triggerType + '_trigger_matched') as SessionStartReason, {\n [triggerType === 'url' ? 'matchedUrl' : 'matchedEvent']: matchDetail,\n })\n } finally {\n this._isActivatingTrigger = false\n }\n }\n\n get isStarted(): boolean {\n return !!this._stopRrweb\n }\n\n get _remoteConfig(): SessionRecordingPersistedConfig | undefined {\n const persistedConfig: any = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n if (!persistedConfig) {\n return undefined\n }\n let parsedConfig: SessionRecordingPersistedConfig\n try {\n parsedConfig = isObject(persistedConfig) ? persistedConfig : JSON.parse(persistedConfig)\n } catch (e) {\n // Do not unregister here: the SDK only registers structured configs, and this read path should\n // ignore corrupt legacy/external values without mutating persistence.\n logger.warn('persisted remote config for session recording is invalid and will be ignored', e)\n return undefined\n }\n\n // Only check TTL if recording hasn't started yet\n // Once started, trust the config until a hard page load\n if (!this.isStarted) {\n // default to now so that configs persisted by older SDK versions\n // (which never set cache_timestamp) are treated as fresh\n const cacheTimestamp = parsedConfig.cache_timestamp ?? Date.now()\n if (Date.now() - cacheTimestamp > RECORDING_REMOTE_CONFIG_TTL_MS) {\n logger.info('persisted remote config for session recording is stale and will be ignored', {\n cacheTimestamp,\n persistedConfig,\n })\n this._instance.persistence?.unregister(SESSION_RECORDING_REMOTE_CONFIG)\n return undefined\n }\n }\n\n return parsedConfig as SessionRecordingPersistedConfig\n }\n\n private _checkOverride(key: string, overrideFunction: () => void, clearOverride: () => void): void {\n const overrideFlag: boolean = this._instance.get_property(key) as boolean\n if (overrideFlag) {\n overrideFunction()\n\n // Clean up the override flag after applying it\n clearOverride()\n }\n }\n\n start(startReason?: SessionStartReason) {\n const config = this._remoteConfig\n if (!config) {\n logger.info('remote config must be stored in persistence before recording can start')\n return\n }\n\n // Invalidate any in-flight async cleanup queued by a prior stop(). On a session-id\n // rotation, _updateWindowAndSessionIds calls stop() then start() synchronously; if\n // stop() took the _stopAfterCompressionQueueDrains path (non-empty compression queue),\n // its async cleanup would later call _teardown() and silently tear down THIS new\n // recorder once the drain promise resolves. Bumping the generation here causes that\n // pending cleanup to bail at its generation check, and resetting the rest of the\n // compression-stop state means a future stop() of this new recorder is not mistaken\n // for the still-in-progress old one (which would make it a silent no-op).\n // Guarded on the stop-in-progress flag because start() is also called re-entrantly\n // on a live recorder (e.g. opt-in flows) where the queue holds the current session's\n // events and must survive.\n // Discard the buffer too — the bailed-out cleanup would have cleared it. Otherwise the\n // prior session's snapshots flush under the old session id with the new distinct_id,\n // mis-attributing the recording (#3822).\n if (this._isStoppingAfterCompression) {\n this._invalidateCompressionQueue()\n this._clearBuffer()\n }\n\n // We want to ensure the sessionManager is reset if necessary on loading the recorder\n const { sessionId, windowId } = this._sessionManager.checkAndGetSessionAndWindowId()\n this._sessionId = sessionId\n this._windowId = windowId\n\n // Reset first full snapshot tracking for the new session\n this._instance.persistence?.unregister(SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP)\n\n if (config?.endpoint) {\n this._endpoint = config?.endpoint\n }\n\n // Initialize the appropriate strategy based on config version\n const isV2 = config?.version === 2 && config?.triggerGroups && config.triggerGroups.length > 0\n\n if (isV2) {\n this._strategy = new V2TriggerGroupStrategy(\n this._instance,\n this._urlTriggerMatching,\n this._reportStarted.bind(this),\n this._tryAddCustomEvent.bind(this),\n this._onTriggerActivated.bind(this)\n )\n } else {\n this._strategy = new V1RecordingStrategy(\n this._instance,\n this._urlTriggerMatching,\n this._eventTriggerMatching,\n this._linkedFlagMatching,\n this._reportStarted.bind(this),\n this._tryTakeFullSnapshot.bind(this),\n this._onTriggerActivated.bind(this)\n )\n }\n\n // Let the strategy configure itself\n this._strategy.onRemoteConfig(config)\n\n // Setup event trigger listeners via strategy\n this._removeEventTriggerCaptureHook?.()\n this._removeEventTriggerCaptureHook = this._strategy.setupEventTriggerListeners(\n this._instance.on.bind(this._instance, 'eventCaptured'),\n this.sessionId,\n (triggerType, matchDetail) => this._activateTrigger(triggerType, matchDetail)\n )\n\n this._checkOverride(\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n () => {\n this.overrideSampling()\n },\n () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_SAMPLING)\n )\n this._checkOverride(\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n () => {\n this.overrideLinkedFlag()\n },\n () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_LINKED_FLAG)\n )\n this._checkOverride(\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n () => {\n this.overrideTrigger('event')\n },\n () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER)\n )\n this._checkOverride(\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n () => {\n this.overrideTrigger('url')\n },\n () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_URL_TRIGGER)\n )\n\n // Let strategy make sampling decisions\n this._strategy.makeSamplingDecisions(this.sessionId)\n this._startRecorder()\n\n if (this._rrwebError) {\n return\n }\n\n // calling addEventListener multiple times is safe and will not add duplicates\n addEventListener(window, 'beforeunload', this._onBeforeUnload)\n addEventListener(window, 'offline', this._onOffline)\n addEventListener(window, 'online', this._onOnline)\n addEventListener(window, 'visibilitychange', this._onVisibilityChange)\n\n if (!this._onSessionIdListener && isFunction(this._sessionManager.onSessionId)) {\n this._onSessionIdListener = this._sessionManager.onSessionId(this._onSessionIdCallback)\n }\n\n // NB: SessionIdManager.on was only added in posthog-js 1.268.6. This recorder chunk is loaded\n // from the CDN and can run against an older bundled core that has no `on` method, so guard the\n // call to degrade gracefully (recording still starts, it just skips the forced-idle-reset listener)\n // rather than throwing a TypeError during start().\n if (!this._onSessionIdleResetForcedListener && isFunction(this._sessionManager.on)) {\n this._onSessionIdleResetForcedListener = this._sessionManager.on('forcedIdleReset', () => {\n // a session was forced to reset due to idle timeout and lack of activity\n this._clearConditionalRecordingPersistence()\n this._isIdle = 'unknown'\n this.stop()\n // then we want a session id listener to restart the recording when a new session starts\n this._forceIdleSessionIdListener = this._sessionManager.onSessionId(\n (sessionId, windowId, changeReason) => {\n // this should first unregister itself\n this._forceIdleSessionIdListener?.()\n this._forceIdleSessionIdListener = undefined\n this._onSessionIdCallback(sessionId, windowId, changeReason)\n }\n )\n })\n } else if (!isFunction(this._sessionManager.on)) {\n logger.warn(\n 'bundled core has no SessionIdManager.on (requires posthog-js >= 1.268.6); ' +\n 'recording will start but skip forced-idle-reset handling'\n )\n }\n\n if (isNullish(this._removePageViewCaptureHook)) {\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this._removePageViewCaptureHook = this._instance.on('eventCaptured', (event) => {\n // If anything could go wrong here,\n // it has the potential to block the main loop,\n // so we catch all errors.\n try {\n if (event.event === '$pageview') {\n const href = event?.properties.$current_url\n ? this._maskReplayUrl(event.properties.$current_url)\n : ''\n if (!href) {\n return\n }\n this._tryAddCustomEvent('$pageview', { href })\n }\n } catch (e) {\n logger.error('Could not add $pageview to rrweb session', e)\n }\n })\n }\n\n if (this.status === ACTIVE) {\n this._reportStarted(startReason || 'recording_initialized')\n }\n }\n\n private _onSessionIdCallback: SessionIdChangedCallback = (sessionId, windowId, changeReason) => {\n if (!changeReason) return\n\n // Skip if session hasn't actually changed (callback might fire multiple times)\n if (sessionId === this._sessionId && windowId === this._windowId) {\n return\n }\n\n const wasLikelyReset = changeReason.noSessionId\n const shouldLinkSessions =\n !wasLikelyReset && (changeReason.activityTimeout || changeReason.sessionPastMaximumLength)\n\n // Capture old IDs before start() updates them\n const oldSessionId = this._sessionId\n const oldWindowId = this._windowId\n\n if (shouldLinkSessions) {\n this._tryAddCustomEvent('$session_ending', {\n currentSessionId: oldSessionId,\n currentWindowId: oldWindowId,\n nextSessionId: sessionId,\n nextWindowId: windowId,\n changeReason,\n // we'll need to correct the time of this if it's captured when idle\n // so we don't extend reported session time with a debug event\n lastActivityTimestamp: this._lastActivityTimestamp,\n flushed_size: this._flushedSizeTracker?.currentTrackedSize(oldSessionId),\n })\n }\n\n // Reset first full snapshot timestamp for the new session\n this._instance.persistence?.unregister(SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP)\n\n this._maxDepthExceeded = false\n getRRWeb()?.resetMaxDepthState?.()\n\n this._tryAddCustomEvent('$session_id_change', { sessionId, windowId, changeReason })\n\n this._clearConditionalRecordingPersistence()\n\n // The $session_id_change emit above can synchronously re-enter\n // _updateWindowAndSessionIds (rrweb delivers addCustomEvent through emit), which\n // adopts the new ids and restarts the recorder itself. Restart here only when the\n // ids are still stale — confirmed idle, stopped, or states where that emit never\n // reached the session check (blocked URL, queued emit) — so a rotation restarts\n // exactly once.\n if (\n (this._isIdle !== false || !this.isStarted) &&\n (this._sessionId !== sessionId || this._windowId !== windowId)\n ) {\n this._isIdle = 'unknown'\n this.stop()\n this.start('session_id_changed')\n }\n\n if (shouldLinkSessions) {\n this._tryAddCustomEvent('$session_starting', {\n previousSessionId: oldSessionId,\n previousWindowId: oldWindowId,\n nextSessionId: sessionId,\n nextWindowId: windowId,\n changeReason,\n // we'll need to correct the time of this if it's captured when idle\n // so we don't extend reported session time with a debug event\n lastActivityTimestamp: this._lastActivityTimestamp,\n })\n }\n\n // always re-decide for the new session — guarding on the persisted config here would skip\n // V2 trigger groups and post-reset() sessions, leaving them undecided (= ACTIVE, unsampled)\n this._strategy?.makeSamplingDecisions(sessionId)\n }\n\n private _teardown() {\n window?.removeEventListener('beforeunload', this._onBeforeUnload)\n window?.removeEventListener('offline', this._onOffline)\n window?.removeEventListener('online', this._onOnline)\n window?.removeEventListener('visibilitychange', this._onVisibilityChange)\n\n clearInterval(this._fullSnapshotTimer)\n this._clearFlushBufferTimer()\n\n this._removePageViewCaptureHook?.()\n this._removePageViewCaptureHook = undefined\n this._removeEventTriggerCaptureHook?.()\n this._removeEventTriggerCaptureHook = undefined\n this._onSessionIdListener?.()\n this._onSessionIdListener = undefined\n this._onSessionIdleResetForcedListener?.()\n this._onSessionIdleResetForcedListener = undefined\n this._forceIdleSessionIdListener?.()\n this._forceIdleSessionIdListener = undefined\n\n this._strategy?.stop()\n\n this._stopRecordingProducers()\n\n this._invalidateCompressionQueue()\n }\n\n // Invalidate any in-flight async compression work so it does not capture events\n // after stop()/discard() has cleared the buffer or after a future restart.\n private _invalidateCompressionQueue() {\n this._compressionQueueGeneration += 1\n this._pendingCompressionEvents = []\n this._queuedCompressionEvents = 0\n this._compressionQueue = undefined\n this._isStoppingAfterCompression = false\n }\n\n private _stopRecordingProducers() {\n this._mutationThrottler?.stop()\n\n // Clear any queued rrweb events to prevent memory leaks from closures\n this._queuedRRWebEvents = []\n\n this._stopRrweb?.()\n this._stopRrweb = undefined\n }\n\n private _stopAfterCompressionQueueDrains(): boolean {\n if (!this._compressionQueue || this._queuedCompressionEvents === 0) {\n return false\n }\n if (this._isStoppingAfterCompression) {\n return true\n }\n\n this._isStoppingAfterCompression = true\n const generation = this._compressionQueueGeneration\n this._clearFlushBufferTimer()\n // Stop rrweb synchronously so it cannot keep producing events while we wait\n // for the compression queue to drain and flush the already queued events.\n this._stopRecordingProducers()\n this._compressionQueue\n .catch(() => undefined)\n .then(() => {\n if (generation !== this._compressionQueueGeneration) {\n return\n }\n\n this._isStoppingAfterCompression = false\n this._flushBuffer()\n this._clearBuffer()\n this._teardown()\n logger.info('stopped')\n })\n .catch(() => {\n // Keep stop() best-effort. Compression errors are handled per event,\n // but never let an unexpected queue failure block teardown.\n this._isStoppingAfterCompression = false\n this._teardown()\n logger.info('stopped')\n })\n\n return true\n }\n\n stop() {\n if (this._stopAfterCompressionQueueDrains()) {\n return\n }\n\n this._flushBuffer()\n this._clearBuffer()\n this._teardown()\n logger.info('stopped')\n }\n\n discard() {\n this._clearBuffer()\n this._teardown()\n logger.info('discarded')\n }\n\n private _captureProcessedEvent(\n event: eventWithTime,\n eventToSend: eventWithTime | compressedEventWithTime,\n size: number,\n targetSessionId: string,\n targetWindowId: string\n ) {\n const properties = {\n $snapshot_bytes: size,\n $snapshot_data: eventToSend,\n $session_id: targetSessionId,\n $window_id: targetWindowId,\n }\n\n if (event.type === EventType.FullSnapshot && getRRWeb()?.wasMaxDepthReached?.()) {\n this._maxDepthExceeded = true\n }\n\n if (this.status === DISABLED) {\n this._clearBuffer()\n return\n }\n\n this._ensureFullSnapshotForSession(event, targetSessionId)\n\n this._captureSnapshotBuffered(properties)\n }\n\n // A session whose incrementals ship before any FullSnapshot is unplayable until the next periodic snapshot, so request one from rrweb (once per session id, to avoid loops if taking one keeps failing).\n private _ensureFullSnapshotForSession(event: eventWithTime, targetSessionId: string) {\n if (event.type === EventType.FullSnapshot) {\n this._lastFullSnapshotSessionId = targetSessionId\n return\n }\n\n if (event.type !== EventType.IncrementalSnapshot) {\n return\n }\n\n if (\n // deliberately conservative: only heal after this recorder shipped a FullSnapshot to another session (the rotation signature), since on a fresh start rrweb's init snapshot is always ordered ahead of any incremental\n isUndefined(this._lastFullSnapshotSessionId) ||\n this._lastFullSnapshotSessionId === targetSessionId ||\n this._fullSnapshotHealAttemptedFor === targetSessionId\n ) {\n return\n }\n\n this._fullSnapshotHealAttemptedFor = targetSessionId\n logger.info('incremental snapshot for a session with no full snapshot - requesting one', {\n sessionId: targetSessionId,\n })\n this._tryTakeFullSnapshot()\n }\n\n private _finishQueuedCompressionEvent(queuedEvent: QueuedCompressionEvent) {\n if (queuedEvent.counted && queuedEvent.generation === this._compressionQueueGeneration) {\n this._queuedCompressionEvents = Math.max(0, this._queuedCompressionEvents - 1)\n }\n queuedEvent.counted = false\n this._pendingCompressionEvents = this._pendingCompressionEvents.filter((x) => x !== queuedEvent)\n }\n\n private _captureQueuedCompressionEvent(\n queuedEvent: QueuedCompressionEvent,\n eventToSend: eventWithTime | compressedEventWithTime,\n size: number\n ) {\n if (queuedEvent.processed || queuedEvent.generation !== this._compressionQueueGeneration) {\n return\n }\n\n queuedEvent.processed = true\n this._captureProcessedEvent(\n queuedEvent.event,\n eventToSend,\n size,\n queuedEvent.targetSessionId,\n queuedEvent.targetWindowId\n )\n }\n\n private _processQueuedCompressionEventSync(queuedEvent: QueuedCompressionEvent) {\n try {\n const { event: eventToSend, size } = queuedEvent.compressionEnabled\n ? compressEventSync(queuedEvent.event)\n : { event: queuedEvent.event, size: estimateSize(queuedEvent.event) }\n\n this._captureQueuedCompressionEvent(queuedEvent, eventToSend, size)\n } finally {\n this._finishQueuedCompressionEvent(queuedEvent)\n }\n }\n\n private _drainCompressionQueueSync() {\n const queuedEvents = [...this._pendingCompressionEvents]\n queuedEvents.forEach((queuedEvent) => {\n this._processQueuedCompressionEventSync(queuedEvent)\n })\n }\n\n private _enqueueCompression(\n event: eventWithTime,\n compressionEnabled: boolean,\n targetSessionId: string,\n targetWindowId: string\n ) {\n const queuedEvent: QueuedCompressionEvent = {\n event,\n compressionEnabled,\n targetSessionId,\n targetWindowId,\n generation: this._compressionQueueGeneration,\n processed: false,\n counted: true,\n }\n this._pendingCompressionEvents.push(queuedEvent)\n this._queuedCompressionEvents += 1\n\n const processEvent = async () => {\n try {\n if (queuedEvent.processed) {\n return\n }\n\n let eventToSend: eventWithTime | compressedEventWithTime\n let size: number\n try {\n const result = compressionEnabled\n ? shouldUseNativeAsyncSessionRecordingGzip(event)\n ? await compressEventAsync(event)\n : compressEventSync(event)\n : { event, size: estimateSize(event) }\n eventToSend = result.event\n size = result.size\n } catch (e) {\n // a compression failure must never reject the queue promise chain, since the\n // rejection would surface as an unhandled rejection and drop the event\n logger.error('could not process queued compression event - will use uncompressed event', e)\n eventToSend = event\n size = estimateSize(event)\n }\n\n this._captureQueuedCompressionEvent(queuedEvent, eventToSend, size)\n } finally {\n this._finishQueuedCompressionEvent(queuedEvent)\n }\n }\n\n this._compressionQueue = this._compressionQueue\n ? this._compressionQueue.catch(() => undefined).then(processEvent)\n : processEvent()\n }\n\n onRRwebEmit(rawEvent: eventWithTime) {\n // late event after sessionManager teardown (e.g. cookieless opt-out) — _sessionManager would throw\n if (!this._instance.sessionManager) {\n return\n }\n\n this._processQueuedEvents()\n\n if (!rawEvent || !isObject(rawEvent)) {\n return\n }\n\n if (rawEvent.type === EventType.Meta) {\n const href = this._maskReplayUrl(rawEvent.data.href)\n this._lastHref = href\n if (!href) {\n return\n }\n rawEvent.data.href = href\n } else {\n this._pageViewFallBack()\n }\n\n // Check if the URL matches any trigger patterns - delegate to strategy\n this._strategy?.checkUrlTriggers(\n this.sessionId,\n () => this._pauseRecording(),\n () => this._resumeRecording(),\n (triggerType, matchDetail) => this._activateTrigger(triggerType, matchDetail)\n )\n\n // always have to check if the URL is blocked really early,\n // or you risk getting stuck in a loop\n if (this._urlTriggerMatching.urlBlocked && !isRecordingPausedEvent(rawEvent)) {\n return\n }\n\n // we're processing a full snapshot, so we should reset the timer\n if (rawEvent.type === EventType.FullSnapshot) {\n this._scheduleFullSnapshot()\n // Full snapshots reset rrweb's node IDs, so clear any logged node tracking\n this._mutationThrottler?.reset()\n\n // Track the timestamp of the first full snapshot for this session\n // This helps us detect session rotation issues where incremental snapshots\n // are sent before the full snapshot\n this._instance.persistence?.register_once(\n {\n [SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP]: rawEvent.timestamp,\n },\n undefined\n )\n }\n\n // Clear the buffer if waiting for a trigger and only keep data from after the current full snapshot\n if (rawEvent.type === EventType.FullSnapshot && this._strategy?.hasPendingTriggers(this.sessionId)) {\n this._clearBufferBeforeMostRecentMeta()\n }\n\n const throttledEvent = this._mutationThrottler ? this._mutationThrottler.throttleMutations(rawEvent) : rawEvent\n\n if (!throttledEvent) {\n return\n }\n\n // TODO: Re-add ensureMaxMessageSize once we are confident in it\n const event = truncateLargeConsoleLogs(throttledEvent)\n\n // Session lifecycle events ($session_ending, $session_starting) carry their target session ID\n // in the payload. We must extract this BEFORE _updateWindowAndSessionIds runs, because that\n // method triggers checkAndGetSessionAndWindowId() which would update this._sessionId.\n // This is critical for $session_ending which must go to the OLD session, not the new one,\n // and for $session_starting which must go to the NEW session.\n const sessionEndingPayload = getSessionEndingPayload(event)\n const sessionStartingPayload = getSessionStartingPayload(event)\n\n if (sessionEndingPayload || sessionStartingPayload) {\n // Adjust timestamp from payload to avoid artificially extending session duration\n const payload = (sessionEndingPayload ?? sessionStartingPayload) as {\n lastActivityTimestamp?: number\n }\n if (payload?.lastActivityTimestamp) {\n event.timestamp = payload.lastActivityTimestamp\n }\n } else {\n this._updateWindowAndSessionIds(event)\n }\n\n if (rawEvent.type === EventType.FullSnapshot) {\n this._fullSnapshotTimestamps.push([this._sessionId, rawEvent.timestamp])\n if (this._fullSnapshotTimestamps.length > 6) {\n this._fullSnapshotTimestamps = this._fullSnapshotTimestamps.slice(-6)\n }\n }\n\n // Route lifecycle events using their payload IDs:\n // - $session_ending uses currentSessionId (the old session it's ending)\n // - $session_starting uses nextSessionId (the new session it's starting)\n // - All other events use the current session ID\n const targetSessionId =\n sessionEndingPayload?.currentSessionId ?? sessionStartingPayload?.nextSessionId ?? this._sessionId\n const targetWindowId =\n sessionEndingPayload?.currentWindowId ?? sessionStartingPayload?.nextWindowId ?? this._windowId\n\n // When in an idle state we keep recording but don't capture the events,\n // we don't want to return early if idle is 'unknown'\n if (this._isIdle === true && !isAllowedWhenIdle(event)) {\n return\n }\n\n if (isSessionIdleEvent(event)) {\n // session idle events have a timestamp when rrweb sees them\n // which can artificially lengthen a session\n // we know when we detected it based on the payload and can correct the timestamp\n const payload = event.data.payload as SessionIdlePayload\n if (payload) {\n const lastActivity = payload.lastActivityTimestamp\n const threshold = payload.threshold\n event.timestamp = lastActivity + threshold\n }\n }\n\n const compressionEnabled = this._instance.config.session_recording.compress_events ?? true\n\n if (\n this._queuedCompressionEvents > 0 ||\n (compressionEnabled && shouldUseNativeAsyncSessionRecordingGzip(event))\n ) {\n this._enqueueCompression(event, compressionEnabled, targetSessionId, targetWindowId)\n return\n }\n\n const { event: eventToSend, size } = compressionEnabled\n ? compressEventSync(event)\n : { event, size: estimateSize(event) }\n this._captureProcessedEvent(event, eventToSend, size, targetSessionId, targetWindowId)\n }\n\n get status(): SessionRecordingStatus {\n if (!this._strategy) {\n return DISABLED\n }\n\n const context: RecordingStrategyContext = {\n instance: this._instance,\n sessionId: this.sessionId,\n isSampled: this._isSampled,\n rrwebError: this._rrwebError,\n urlTriggerMatching: this._urlTriggerMatching,\n eventTriggerMatching: this._eventTriggerMatching,\n linkedFlagMatching: this._linkedFlagMatching,\n remoteConfig: this._remoteConfig,\n }\n\n return this._strategy.getStatus(context)\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n this._instance.sessionRecording?.onRRwebEmit({\n type: 6,\n data: {\n plugin: 'rrweb/console@1',\n payload: {\n level,\n trace: [],\n // Even though it is a string, we stringify it as that's what rrweb expects\n payload: [JSON.stringify(message)],\n },\n },\n timestamp: Date.now(),\n })\n }\n\n public overrideLinkedFlag() {\n this._linkedFlagMatching.linkedFlagSeen = true\n this._tryTakeFullSnapshot()\n this._reportStarted('linked_flag_overridden')\n }\n\n /**\n * this ignores the sampling config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({sampling: true})`\n * */\n public overrideSampling() {\n this._instance.persistence?.register({\n // short-circuits the `makeSamplingDecision` function in the session recording module\n [SESSION_RECORDING_IS_SAMPLED]: this.sessionId,\n [SESSION_RECORDING_SAMPLE_RATE]: null,\n })\n this._tryTakeFullSnapshot()\n this._reportStarted('sampling_overridden')\n }\n\n /**\n * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n * */\n public overrideTrigger(triggerType: TriggerType) {\n this._activateTrigger(triggerType)\n }\n\n private _currentMaskedHostname(): string | undefined {\n try {\n const href = window?.location?.href\n if (!href) {\n return undefined\n }\n const maskedUrl = this._maskReplayUrl(href)\n if (!maskedUrl) {\n return undefined\n }\n // not convertToURL: it resolves invalid input (e.g. a masking fn returning \"REDACTED\")\n // against the current page and would return the real hostname we're trying to mask.\n // new URL throws instead, so bad input falls through to the catch and we omit the property.\n // eslint-disable-next-line compat/compat\n return new URL(maskedUrl).hostname || undefined\n } catch {\n return undefined\n }\n }\n\n private _clearFlushBufferTimer() {\n if (this._flushBufferTimer) {\n clearTimeout(this._flushBufferTimer)\n this._flushBufferTimer = undefined\n }\n }\n\n private _flushBuffer(): SnapshotBuffer {\n this._clearFlushBufferTimer()\n\n // never flush while a sampling decision is missing (e.g. wiped by posthog.reset()) — an\n // undecided session reads as ACTIVE and would leak a batch it then decides not to record\n this._strategy?.ensureSamplingDecision(this.sessionId)\n\n const isBelowMinimumDuration = this._isBelowMinimumDuration()\n\n if (this.status === BUFFERING || this.status === PAUSED || this.status === DISABLED || isBelowMinimumDuration) {\n this._flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n return this._buffer\n }\n\n if (this._buffer.data.length > 0) {\n const snapshotHostname = this._currentMaskedHostname()\n const snapshotEvents = splitBuffer(this._buffer)\n snapshotEvents.forEach((snapshotBuffer) => {\n this._flushedSizeTracker?.trackSize(snapshotBuffer.sessionId, snapshotBuffer.size)\n this._captureSnapshot({\n $snapshot_bytes: snapshotBuffer.size,\n $snapshot_data: snapshotBuffer.data,\n $session_id: snapshotBuffer.sessionId,\n $window_id: snapshotBuffer.windowId,\n $lib: Config.LIB_NAME,\n $lib_version: Config.LIB_VERSION,\n $snapshot_host: snapshotHostname,\n })\n })\n\n // Notify strategy that initial flush is complete (performance optimization)\n this._strategy?.onFlushComplete()\n }\n\n // buffer is empty, we clear it in case the session id has changed\n return this._clearBuffer()\n }\n\n private _hasPassedMinimumDuration = (): boolean => {\n const persistedSessionId = this._instance.persistence?.props[SESSION_RECORDING_PAST_MINIMUM_DURATION]\n return persistedSessionId === this._sessionId\n }\n\n private _getBufferDuration = (): number | null => {\n if (this._buffer.data.length === 0) {\n return null\n }\n\n const firstTimestamp = this._buffer.data[0]?.timestamp\n const lastTimestamp = this._buffer.data[this._buffer.data.length - 1]?.timestamp\n\n if (!isNumber(firstTimestamp) || !isNumber(lastTimestamp)) {\n return null\n }\n\n return lastTimestamp - firstTimestamp\n }\n\n private _isBelowMinimumDuration = (): boolean => {\n const minimumDuration = this._minimumDuration\n if (!isNumber(minimumDuration)) {\n return false\n }\n\n const strictMode = this._instance.config.session_recording?.strictMinimumDuration ?? false\n\n if (!strictMode) {\n const sessionDuration = this._sessionDuration\n const isPositiveSessionDuration = isNumber(sessionDuration) && sessionDuration >= 0\n return isPositiveSessionDuration && sessionDuration < minimumDuration\n }\n\n if (this._hasPassedMinimumDuration()) {\n return false\n }\n\n const bufferDuration = this._getBufferDuration()\n if (isNull(bufferDuration)) {\n return true\n }\n\n if (bufferDuration >= minimumDuration) {\n this._instance.persistence?.register({\n [SESSION_RECORDING_PAST_MINIMUM_DURATION]: this._sessionId,\n })\n return false\n }\n\n return true\n }\n\n private _captureSnapshotBuffered(properties: Properties) {\n const additionalBytes = 2 + (this._buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n\n // Extract target session ID from properties to ensure we flush when session changes\n // This is critical for lifecycle events ($session_ending, $session_starting) which may\n // have different target session IDs than this._sessionId\n const targetSessionId = properties.$session_id as string\n\n // A session-id mismatch must flush and rebind even while idle, or an idle rotation appends the new session's Meta and FullSnapshot to the old session's buffer and ships them under the old session id.\n const sessionChanged = this._buffer.sessionId !== targetSessionId\n\n if (\n sessionChanged ||\n // we never want to flush a healthy same-session buffer while confirmed idle, but\n // 'unknown' still captures so its buffer must respect the size cap or it grows unbounded\n (this._isIdle !== true &&\n this._buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE)\n ) {\n this._buffer = this._flushBuffer()\n // A suppressed flush (e.g. buffering, paused, below minimum duration) returns the buffer un-drained, and relabeling the prior session's events would mis-attribute them, so discard them instead.\n if (sessionChanged && this._buffer.data.length > 0) {\n this._buffer = this._clearBuffer()\n }\n // After flushing, update buffer to use the new target session/window IDs\n this._buffer.sessionId = targetSessionId\n this._buffer.windowId = properties.$window_id as string\n }\n\n this._buffer.size += properties.$snapshot_bytes\n this._buffer.data.push(properties.$snapshot_data)\n this._buffer.sizes.push(properties.$snapshot_bytes)\n\n // Schedule the flush unless confirmed idle: a tab that never sees user interaction stays\n // 'unknown' indefinitely, and without a timer its captured events (including the initial\n // full snapshot after a session rotation) would never ship until the next rotation or unload.\n if (!this._flushBufferTimer && this._isIdle !== true) {\n this._flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n }\n }\n\n private _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this._instance.capture('$snapshot', properties, {\n _url: this._instance.requestRouter.endpointFor('api', this._endpoint),\n _noTruncate: true,\n _batchKey: SESSION_RECORDING_BATCH_KEY,\n skip_client_rate_limiting: true,\n })\n }\n\n private get _sessionDuration(): number | null {\n const mostRecentSnapshot = this._buffer?.data[this._buffer?.data.length - 1]\n const { sessionStartTimestamp } = this._sessionManager.checkAndGetSessionAndWindowId(true)\n return mostRecentSnapshot ? mostRecentSnapshot.timestamp - sessionStartTimestamp : null\n }\n\n private _clearBufferBeforeMostRecentMeta(): SnapshotBuffer {\n if (!this._buffer || this._buffer.data.length === 0) {\n return this._clearBuffer()\n }\n\n // Find the last meta event index by iterating backwards\n let lastMetaIndex = -1\n for (let i = this._buffer.data.length - 1; i >= 0; i--) {\n if (this._buffer.data[i].type === EventType.Meta) {\n lastMetaIndex = i\n break\n }\n }\n if (lastMetaIndex >= 0) {\n this._buffer.data = this._buffer.data.slice(lastMetaIndex)\n this._buffer.sizes = this._buffer.sizes.slice(lastMetaIndex)\n this._buffer.size = this._buffer.sizes.reduce((a, b) => a + b, 0)\n return this._buffer\n } else {\n return this._clearBuffer()\n }\n }\n\n private _clearBuffer(): SnapshotBuffer {\n this._buffer = {\n size: 0,\n data: [],\n sizes: [],\n sessionId: this._sessionId,\n windowId: this._windowId,\n }\n return this._buffer\n }\n\n private _onBeforeUnload = (): void => {\n // If still buffering (waiting for triggers), discard the buffer\n if (this.status === BUFFERING) {\n this._clearBuffer()\n return\n }\n\n // beforeunload cannot wait for async CompressionStream work. Synchronously\n // compress any queued events so sendBeacon can include them in this flush.\n this._drainCompressionQueueSync()\n this._flushBuffer()\n }\n\n private _onOffline = (): void => {\n this._tryAddCustomEvent('browser offline', {})\n }\n\n private _onOnline = (): void => {\n this._tryAddCustomEvent('browser online', {})\n }\n\n private _onVisibilityChange = (): void => {\n if (document?.visibilityState) {\n const label = 'window ' + document.visibilityState\n this._tryAddCustomEvent(label, {})\n }\n }\n\n private _reportStarted(startReason: SessionStartReason, tagPayload?: Record<string, any>) {\n this._instance.register_for_session({\n [SESSION_RECORDING_START_REASON]: startReason,\n })\n logger.info(startReason.replace('_', ' '), tagPayload)\n if (startReason !== 'session_id_changed') {\n this._tryAddCustomEvent('$recording_started', {\n reason: startReason,\n ...tagPayload,\n })\n }\n }\n\n private _isInteractiveEvent(event: eventWithTime) {\n return (\n event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE &&\n ACTIVE_SOURCES.indexOf(event.data?.source as IncrementalSource) !== -1\n )\n }\n\n private _updateWindowAndSessionIds(event: eventWithTime) {\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n\n const isUserInteraction = this._isInteractiveEvent(event)\n\n if (!isUserInteraction && !this._isIdle) {\n // We check if the lastActivityTimestamp is old enough to go idle\n const timeSinceLastActivity = event.timestamp - this._lastActivityTimestamp\n if (timeSinceLastActivity > this._sessionIdleThresholdMilliseconds) {\n // we mark as idle right away,\n // or else we get multiple idle events\n // if there are lots of non-user activity events being emitted\n this._isIdle = true\n\n // don't take full snapshots while idle\n clearInterval(this._fullSnapshotTimer)\n\n this._tryAddCustomEvent('sessionIdle', {\n eventTimestamp: event.timestamp,\n lastActivityTimestamp: this._lastActivityTimestamp,\n threshold: this._sessionIdleThresholdMilliseconds,\n bufferLength: this._buffer.data.length,\n bufferSize: this._buffer.size,\n })\n\n // proactively flush the buffer in case the session is idle for a long time\n this._flushBuffer()\n }\n }\n\n let returningFromIdle = false\n if (isUserInteraction) {\n this._lastActivityTimestamp = event.timestamp\n if (this._isIdle) {\n const idleWasUnknown = this._isIdle === 'unknown'\n // Remove the idle state\n this._isIdle = false\n // if the idle state was unknown, we don't want to add an event, since we're just in bootup\n // whereas if it was true, we know we've been idle for a while, and we can mark ourselves as returning from idle\n if (!idleWasUnknown) {\n this._tryAddCustomEvent('sessionNoLongerIdle', {\n reason: 'user activity',\n type: event.type,\n })\n returningFromIdle = true\n }\n }\n }\n\n // Only bail on confirmed idle: while 'unknown' the recorder still captures, so it must\n // also keep checking for session changes or its events are stamped with a stale session id.\n if (this._isIdle === true) {\n return\n }\n\n // We only want to extend the session if it is an interactive event.\n const { windowId, sessionId } = this._sessionManager.checkAndGetSessionAndWindowId(\n !isUserInteraction,\n event.timestamp\n )\n\n const sessionIdChanged = this._sessionId !== sessionId\n const windowIdChanged = this._windowId !== windowId\n\n this._windowId = windowId\n this._sessionId = sessionId\n\n if (sessionIdChanged || windowIdChanged) {\n this.stop()\n this.start('session_id_changed')\n } else if (returningFromIdle) {\n this._scheduleFullSnapshot()\n }\n }\n\n private _clearConditionalRecordingPersistence(): void {\n this._strategy?.clearConditionalRecordingPersistence()\n }\n\n get sdkDebugProperties(): Properties {\n const { sessionStartTimestamp } = this._sessionManager.checkAndGetSessionAndWindowId(true)\n\n return {\n $recording_status: this.status,\n $sdk_debug_replay_internal_buffer_length: this._buffer.data.length,\n $sdk_debug_replay_internal_buffer_size: this._buffer.size,\n $sdk_debug_current_session_duration: this._sessionDuration,\n $sdk_debug_session_start: sessionStartTimestamp,\n $sdk_debug_replay_flushed_size: this._flushedSizeTracker?.currentTrackedSize(this.sessionId),\n $sdk_debug_replay_full_snapshots: this._fullSnapshotTimestamps,\n $snapshot_max_depth_exceeded: this._maxDepthExceeded,\n $sdk_debug_replay_rrweb_error: this._rrwebError,\n [SDK_DEBUG_REPLAY_RRWEB_ATTACHED]: !!this._stopRrweb,\n [SDK_DEBUG_REPLAY_RRWEB_START_ATTEMPTED]: this._rrwebStartAttempted,\n }\n }\n\n private _startRecorder() {\n if (this._stopRrweb) {\n return\n }\n this._rrwebStartAttempted = true\n\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions = {\n // a limited set of the rrweb config options that we expose to our users.\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskTextClass: 'ph-mask',\n maskTextSelector: undefined,\n maskTextFn: undefined,\n maskAllInputs: true,\n maskInputOptions: { password: true },\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n recordCrossOriginIframes: false,\n attributeFilter: undefined,\n }\n\n // only allows user to set our allowlisted options\n const userSessionRecordingOptions = this._instance.config.session_recording\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n if (key === 'maskInputOptions') {\n // ensure password config is set if not included\n sessionRecordingOptions.maskInputOptions = { password: true, ...value }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n }\n\n if (this._canvasRecording && this._canvasRecording.enabled) {\n sessionRecordingOptions.recordCanvas = true\n sessionRecordingOptions.sampling = { canvas: this._canvasRecording.fps }\n sessionRecordingOptions.dataURLOptions = { type: 'image/webp', quality: this._canvasRecording.quality }\n sessionRecordingOptions.canvasResolutionScale = this._canvasResolutionScale\n }\n\n if (this._masking) {\n sessionRecordingOptions.maskAllInputs = this._masking.maskAllInputs ?? true\n sessionRecordingOptions.maskTextSelector = this._masking.maskTextSelector ?? undefined\n sessionRecordingOptions.blockSelector = this._masking.blockSelector ?? undefined\n }\n\n this._warnIfClientMaskingShadowsServer()\n\n const rrwebRecord = getRRWebRecord()\n if (!rrwebRecord) {\n logger.error(\n '_startRecorder was called but rrwebRecord is not available. This indicates something has gone wrong.'\n )\n return\n }\n\n this._mutationThrottler =\n this._mutationThrottler ??\n new MutationThrottler(rrwebRecord, {\n refillRate: this._instance.config.session_recording.__mutationThrottlerRefillRate,\n bucketSize: this._instance.config.session_recording.__mutationThrottlerBucketSize,\n onBlockedNode: (id, node) => {\n const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n logger.info(message, {\n node: node,\n })\n\n this.log(LOGGER_PREFIX + ' ' + message, 'warn')\n },\n })\n\n const activePlugins = this._gatherRRWebPlugins()\n this._stopRrweb = rrwebRecord({\n emit: (event) => {\n this.onRRwebEmit(event)\n },\n plugins: activePlugins,\n ...sessionRecordingOptions,\n })\n\n if (!this._stopRrweb) {\n this._rrwebError = true\n logger.error(\n 'rrweb failed to start - Loss of recording data is possible. Check the browser console for rrweb errors.'\n )\n return\n }\n\n this._rrwebError = false\n\n // We reset the last activity timestamp, resetting the idle timer\n this._lastActivityTimestamp = Date.now()\n // stay unknown if we're not sure if we're idle or not\n this._isIdle = isBoolean(this._isIdle) ? this._isIdle : 'unknown'\n\n this.tryAddCustomEvent('$remote_config_received', this._remoteConfig)\n this._tryAddCustomEvent('$session_options', {\n sessionRecordingOptions,\n activePlugins: activePlugins.map((p) => p?.name),\n })\n\n this._tryAddCustomEvent('$posthog_config', {\n config: this._instance.config,\n })\n }\n\n tryAddCustomEvent(tag: string, payload: any): boolean {\n return this._tryAddCustomEvent(tag, payload)\n }\n}\n","import {\n COOKIELESS_ALWAYS,\n SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED,\n SESSION_RECORDING_IS_SAMPLED,\n SESSION_RECORDING_SAMPLE_RATE,\n SESSION_RECORDING_OVERRIDE_SAMPLING,\n SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n SESSION_RECORDING_REMOTE_CONFIG,\n} from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfigLoader } from '../../remote-config'\nimport {\n Properties,\n RemoteConfig,\n RemoteConfigResult,\n SessionRecordingPersistedConfig,\n SessionStartReason,\n} from '../../types'\nimport { type eventWithTime } from './types/rrweb-types'\n\nimport { isNullish, isNumber, isUndefined, isValidSampleRate } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow, LazyLoadedSessionRecordingInterface, PostHogExtensionKind } from '../../utils/globals'\nimport { RECORDING_REMOTE_CONFIG_TTL_MS } from './external/lazy-loaded-session-recorder'\nimport {\n AWAITING_CONFIG,\n DISABLED,\n LAZY_LOADING,\n MISSING_CONFIG,\n SessionRecordingStatus,\n TriggerType,\n} from './external/triggerMatching'\nimport type { Extension } from '../types'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\nexport class SessionRecording implements Extension {\n _forceAllowLocalhostNetworkCapture: boolean = false\n\n private _recordingStatus: SessionRecordingStatus = DISABLED\n\n private get _config() {\n return this._instance.config\n }\n\n private get _persistence() {\n return this._instance.persistence\n }\n\n private _persistFlagsOnSessionListener: (() => void) | undefined = undefined\n private _lazyLoadedSessionRecording: LazyLoadedSessionRecordingInterface | undefined\n\n public get started(): boolean {\n return !!this._lazyLoadedSessionRecording?.isStarted\n }\n\n get status(): SessionRecordingStatus {\n if (this._recordingStatus === AWAITING_CONFIG || this._recordingStatus === MISSING_CONFIG) {\n return this._recordingStatus\n }\n return this._lazyLoadedSessionRecording?.status ?? this._recordingStatus\n }\n\n constructor(private readonly _instance: PostHog) {\n if (!this._instance.sessionManager) {\n logger.error('started without valid sessionManager')\n throw new Error(LOGGER_PREFIX + ' started without valid sessionManager. This is a bug.')\n }\n\n if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n throw new Error(LOGGER_PREFIX + ' cannot be used with cookieless_mode=\"always\"')\n }\n }\n\n initialize() {\n this.startIfEnabledOrStop()\n }\n\n private get _isRecordingEnabled() {\n const enabled_server_side = !!this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)?.enabled\n const enabled_client_side = !this._config.disable_session_recording\n const isDisabled = this._config.disable_session_recording || this._instance.consent.isOptedOut()\n return window && enabled_server_side && enabled_client_side && !isDisabled\n }\n\n startIfEnabledOrStop(startReason?: SessionStartReason) {\n if (this._isRecordingEnabled && this._lazyLoadedSessionRecording?.isStarted) {\n return\n }\n\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API, which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" and \"Array.from\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n const canRunReplay = !isUndefined(Object.assign) && !isUndefined(Array.from)\n if (this._isRecordingEnabled && canRunReplay) {\n this._lazyLoadAndStart(startReason)\n logger.info('starting')\n } else {\n this._recordingStatus = DISABLED\n this.stopRecording()\n }\n }\n\n /**\n * session recording waits until it receives remote config before loading the script\n * this is to ensure we can control the script name remotely\n * and because we wait until we have local and remote config to determine if we should start at all\n * if start is called and there is no remote config then we wait until there is\n */\n private _lazyLoadAndStart(startReason?: SessionStartReason) {\n // by checking `_isRecordingEnabled` here we know that\n // we have stored remote config and client config to read\n // replay waits for both local and remote config before starting\n if (!this._isRecordingEnabled) {\n return\n }\n\n if (this._recordingStatus !== AWAITING_CONFIG && this._recordingStatus !== MISSING_CONFIG) {\n this._recordingStatus = LAZY_LOADING\n }\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported), don't load the script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded.\n if (\n !assignableWindow?.__PosthogExtensions__?.rrweb?.record ||\n !assignableWindow.__PosthogExtensions__?.initSessionRecording\n ) {\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n this._instance,\n this._scriptName,\n (err) => {\n if (err) {\n return logger.error('could not load recorder', err)\n }\n this._onScriptLoaded(startReason)\n }\n )\n } else {\n this._onScriptLoaded(startReason)\n }\n }\n\n stopRecording() {\n this._persistFlagsOnSessionListener?.()\n this._persistFlagsOnSessionListener = undefined\n this._lazyLoadedSessionRecording?.stop()\n }\n\n private _discardRecording() {\n this._persistFlagsOnSessionListener?.()\n this._persistFlagsOnSessionListener = undefined\n this._lazyLoadedSessionRecording?.discard()\n }\n\n private _resetSampling() {\n this._persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n this._persistence?.unregister(SESSION_RECORDING_SAMPLE_RATE)\n }\n\n private _validateSampleRate(rate: unknown, source: string): number | null {\n if (isNullish(rate)) {\n return null\n }\n const parsed = isNumber(rate) ? rate : parseFloat(rate as string)\n if (!isValidSampleRate(parsed)) {\n logger.warn(`${source} must be between 0 and 1. Ignoring invalid value:`, rate)\n return null\n }\n return parsed\n }\n\n private _persistRemoteConfig(response: RemoteConfig): void {\n if (this._persistence) {\n const persistence = this._persistence\n\n const persistResponse = () => {\n const sessionRecordingConfigResponse =\n response.sessionRecording === false ? undefined : response.sessionRecording\n\n const localSampleRate = this._validateSampleRate(\n this._config.session_recording?.sampleRate,\n 'session_recording.sampleRate'\n )\n const remoteSampleRate = this._validateSampleRate(\n sessionRecordingConfigResponse?.sampleRate,\n 'remote config sampleRate'\n )\n const parsedSampleRate = localSampleRate ?? remoteSampleRate\n if (isNullish(parsedSampleRate)) {\n this._resetSampling()\n }\n\n const receivedMinimumDuration = sessionRecordingConfigResponse?.minimumDurationMilliseconds\n\n persistence.register({\n [SESSION_RECORDING_REMOTE_CONFIG]: {\n cache_timestamp: Date.now(),\n enabled: !!sessionRecordingConfigResponse,\n ...sessionRecordingConfigResponse,\n networkPayloadCapture: {\n capturePerformance: response.capturePerformance,\n ...sessionRecordingConfigResponse?.networkPayloadCapture,\n },\n canvasRecording: {\n enabled: sessionRecordingConfigResponse?.recordCanvas,\n fps: sessionRecordingConfigResponse?.canvasFps,\n quality: sessionRecordingConfigResponse?.canvasQuality,\n },\n sampleRate: parsedSampleRate,\n minimumDurationMilliseconds: isUndefined(receivedMinimumDuration)\n ? null\n : receivedMinimumDuration,\n endpoint: sessionRecordingConfigResponse?.endpoint,\n triggerMatchType: sessionRecordingConfigResponse?.triggerMatchType,\n masking: sessionRecordingConfigResponse?.masking,\n urlTriggers: sessionRecordingConfigResponse?.urlTriggers,\n // V2 fields - will be undefined for V1 configs\n version: sessionRecordingConfigResponse?.version,\n triggerGroups: sessionRecordingConfigResponse?.triggerGroups,\n } satisfies SessionRecordingPersistedConfig,\n })\n }\n\n persistResponse()\n\n // in case we see multiple flags responses, we should only use the response from the most recent one\n this._persistFlagsOnSessionListener?.()\n // we 100% know there is a session manager by this point\n this._persistFlagsOnSessionListener = this._instance.sessionManager?.onSessionId(persistResponse)\n }\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n // A failed fetch and a response without a sessionRecording key behave the same:\n // no fresh server config arrived, so fall back to whatever is already persisted.\n const response = result.ok ? result.config : undefined\n if (!response || !('sessionRecording' in response)) {\n if (this._recordingStatus === AWAITING_CONFIG) {\n this._recordingStatus = MISSING_CONFIG\n logger.warn('config refresh failed, recording will not start until page reload')\n }\n this.startIfEnabledOrStop()\n return\n }\n if (response.sessionRecording === false) {\n this._persistRemoteConfig(response)\n this._discardRecording()\n return\n }\n\n this._persistRemoteConfig(response)\n this.startIfEnabledOrStop()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n if (this._lazyLoadedSessionRecording?.log) {\n this._lazyLoadedSessionRecording.log(message, level)\n } else {\n logger.warn('log called before recorder was ready')\n }\n }\n\n private get _scriptName(): PostHogExtensionKind {\n const remoteConfig: SessionRecordingPersistedConfig | undefined = this._instance?.persistence?.get_property(\n SESSION_RECORDING_REMOTE_CONFIG\n )\n return (remoteConfig?.scriptConfig?.script as PostHogExtensionKind) || 'lazy-recorder'\n }\n\n private _isRemoteConfigFresh(): boolean {\n const persistedConfig = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n if (!persistedConfig) {\n return false\n }\n let config: SessionRecordingPersistedConfig\n try {\n config = typeof persistedConfig === 'object' ? persistedConfig : JSON.parse(persistedConfig)\n } catch (e) {\n // Do not unregister here: the SDK only registers structured configs, and this read path should\n // ignore corrupt legacy/external values without mutating persistence.\n logger.warn('persisted remote config for session recording is invalid and will be ignored', e)\n return false\n }\n // default to now so that configs persisted by older SDK versions\n // (which never set cache_timestamp) are treated as fresh\n const cacheTimestamp = config.cache_timestamp ?? Date.now()\n return Date.now() - cacheTimestamp <= RECORDING_REMOTE_CONFIG_TTL_MS\n }\n\n private _onScriptLoaded(startReason?: SessionStartReason) {\n if (!assignableWindow.__PosthogExtensions__?.initSessionRecording) {\n logger.warn(\n 'Called on script loaded before session recording is available. This can be caused by adblockers.'\n )\n this._instance.register_for_session({\n [SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED]: true,\n })\n return\n }\n\n if (!this._lazyLoadedSessionRecording) {\n this._lazyLoadedSessionRecording = assignableWindow.__PosthogExtensions__?.initSessionRecording(\n this._instance\n )\n ;(this._lazyLoadedSessionRecording as any)._forceAllowLocalhostNetworkCapture =\n this._forceAllowLocalhostNetworkCapture\n }\n\n if (!this._isRemoteConfigFresh()) {\n if (this._recordingStatus === MISSING_CONFIG || this._recordingStatus === AWAITING_CONFIG) {\n return\n }\n this._recordingStatus = AWAITING_CONFIG\n logger.info('persisted remote config is stale, requesting fresh config before starting')\n new RemoteConfigLoader(this._instance).load()\n return\n }\n\n this._recordingStatus = LAZY_LOADING\n this._lazyLoadedSessionRecording.start(startReason)\n }\n\n /**\n * this is maintained on the public API only because it has always been on the public API\n * if you are calling this directly you are certainly doing something wrong\n * @deprecated\n */\n onRRwebEmit(rawEvent: eventWithTime) {\n this._lazyLoadedSessionRecording?.onRRwebEmit?.(rawEvent)\n }\n\n /**\n * this ignores the linked flag config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({linked_flag: true})`\n * */\n public overrideLinkedFlag() {\n if (!this._lazyLoadedSessionRecording) {\n this._persistence?.register({\n [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideLinkedFlag()\n }\n\n /**\n * this ignores the sampling config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({sampling: true})`\n * */\n public overrideSampling() {\n if (!this._lazyLoadedSessionRecording) {\n this._persistence?.register({\n [SESSION_RECORDING_OVERRIDE_SAMPLING]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideSampling()\n }\n\n /**\n * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n *\n * It is not usual to call this directly,\n * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n * */\n public overrideTrigger(triggerType: TriggerType) {\n if (!this._lazyLoadedSessionRecording) {\n this._persistence?.register({\n [triggerType === 'url'\n ? SESSION_RECORDING_OVERRIDE_URL_TRIGGER\n : SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: true,\n })\n }\n\n this._lazyLoadedSessionRecording?.overrideTrigger(triggerType)\n }\n\n /*\n * whenever we capture an event, we add these properties to the event\n * these are used to debug issues with the session recording\n * when looking at the event feed for a session\n */\n get sdkDebugProperties(): Properties {\n return (\n this._lazyLoadedSessionRecording?.sdkDebugProperties || {\n $recording_status: this.status,\n }\n )\n }\n\n /**\n * This adds a custom event to the session recording\n *\n * It is not intended for arbitrary public use - playback only displays known custom events\n * And is exposed on the public interface only so that other parts of the SDK are able to use it\n *\n * if you are calling this from client code, you're probably looking for `posthog.capture('$custom_event', {...})`\n */\n tryAddCustomEvent(tag: string, payload: any): boolean {\n return !!this._lazyLoadedSessionRecording?.tryAddCustomEvent(tag, payload)\n }\n}\n","import RageClick from './extensions/rageclick'\nimport { DeadClickCandidate, Properties, RemoteConfigResult } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { document, window } from '@posthog/browser-common/utils/globals'\nimport {\n getEventTarget,\n getParentElement,\n shouldCaptureRageclick,\n} from '@posthog/browser-common/utils/autocapture-utils'\nimport { DOM_EVENT_BEFOREUNLOAD, DOM_EVENT_VISIBILITYCHANGE, HEATMAPS_ENABLED_SERVER_SIDE } from './constants'\nimport { isNumber, isNullish, isEmptyObject, isObject, stripUrlHash } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { isElementInToolbar, isElementNode, isTag } from '@posthog/browser-common/utils/element-utils'\nimport { DeadClicksAutocapture, isDeadClicksEnabledForHeatmaps } from './extensions/dead-clicks-autocapture'\nimport { includes } from '@posthog/core'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { maskQueryParams } from '@posthog/browser-common/utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from '@posthog/browser-common/utils/event-utils'\nimport type { Extension } from './extensions/types'\n\nconst DEFAULT_FLUSH_INTERVAL = 5000\n\nconst logger = createLogger('[Heatmaps]')\n\ntype HeatmapEventBuffer =\n | {\n [key: string]: Properties[]\n }\n | undefined\n\nfunction elementOrParentPositionMatches(el: Element | null, matches: string[], breakOnElement?: Element): boolean {\n let curEl: Element | null | false = el\n\n while (curEl && isElementNode(curEl) && !isTag(curEl, 'body')) {\n if (curEl === breakOnElement) {\n return false\n }\n\n let position: string | undefined\n try {\n position = (curEl.ownerDocument?.defaultView ?? window)?.getComputedStyle(curEl).position\n } catch {\n return false\n }\n\n if (includes(matches, position)) {\n return true\n }\n\n curEl = getParentElement(curEl)\n }\n\n return false\n}\n\nfunction isValidMouseEvent(e: unknown): e is MouseEvent {\n return isObject(e) && 'clientX' in e && 'clientY' in e && isNumber(e.clientX) && isNumber(e.clientY)\n}\n\nfunction shouldPoll(document: Document | undefined): boolean {\n return document?.visibilityState === 'visible'\n}\n\nexport class Heatmaps implements Extension {\n instance: PostHog\n rageclicks: RageClick\n _enabledServerSide: boolean = false\n\n private get _config() {\n return this.instance.config\n }\n\n _initialized = false\n _mouseMoveTimeout: ReturnType<typeof setTimeout> | undefined\n\n private _buffer: HeatmapEventBuffer\n private _flushInterval: ReturnType<typeof setInterval> | null = null\n private _deadClicksCapture: DeadClicksAutocapture | undefined\n private _onClickHandler: ((e: Event) => void) | undefined\n private _onMouseMoveHandler: ((e: Event) => void) | undefined\n private _flushHandler: (() => void) | undefined\n private _onVisibilityChange_handler: (() => void) | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._enabledServerSide = !!this.instance.persistence?.props[HEATMAPS_ENABLED_SERVER_SIDE]\n this.rageclicks = new RageClick(instance.config.rageclick)\n }\n\n initialize() {\n this.startIfEnabled()\n }\n\n public get flushIntervalMilliseconds(): number {\n let flushInterval = DEFAULT_FLUSH_INTERVAL\n if (isObject(this._config.capture_heatmaps) && this._config.capture_heatmaps.flush_interval_milliseconds) {\n flushInterval = this._config.capture_heatmaps.flush_interval_milliseconds\n }\n return flushInterval\n }\n\n public get isEnabled(): boolean {\n if (!isNullish(this._config.capture_heatmaps)) {\n return this._config.capture_heatmaps !== false\n }\n if (!isNullish(this._config.enable_heatmaps)) {\n return this._config.enable_heatmaps\n }\n return this._enabledServerSide\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled) {\n // nested if here since we only want to run the else\n // if this.enabled === false\n // not if this method is called more than once\n if (this._initialized) {\n return\n }\n logger.info('starting...')\n this._setupListeners()\n this._onVisibilityChange()\n } else {\n clearInterval(this._flushInterval ?? undefined)\n this._removeListeners()\n this.getAndClearBuffer()\n }\n }\n\n public onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without a heatmaps key.\n return\n }\n\n const response = result.config\n if (!('heatmaps' in response)) {\n return\n }\n\n const optIn = !!response['heatmaps']\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [HEATMAPS_ENABLED_SERVER_SIDE]: optIn,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = optIn\n this.startIfEnabled()\n }\n\n public getAndClearBuffer(): HeatmapEventBuffer {\n const buffer = this._buffer\n this._buffer = undefined\n return buffer\n }\n\n private _onDeadClick(click: DeadClickCandidate): void {\n // heatmaps only plots click coordinates; this also rejects swipe candidates (never\n // expected on this path), since a swipe's TouchEvent has no clientX/clientY\n if (!isValidMouseEvent(click.originalEvent)) {\n return\n }\n this._onClick(click.originalEvent, 'deadclick')\n }\n\n private _onVisibilityChange(): void {\n // always clear the interval just in case\n if (this._flushInterval) {\n clearInterval(this._flushInterval)\n }\n\n this._flushInterval = shouldPoll(document)\n ? setInterval(this._flush.bind(this), this.flushIntervalMilliseconds)\n : null\n }\n\n private _setupListeners(): void {\n if (!window || !document) {\n return\n }\n\n this._flushHandler = this._flush.bind(this)\n addEventListener(window, DOM_EVENT_BEFOREUNLOAD, this._flushHandler)\n\n this._onClickHandler = (e) => this._onClick((e || window?.event) as MouseEvent)\n addEventListener(document, 'click', this._onClickHandler, { capture: true })\n\n this._onMouseMoveHandler = (e) => this._onMouseMove((e || window?.event) as MouseEvent)\n addEventListener(document, 'mousemove', this._onMouseMoveHandler, { capture: true })\n\n this._deadClicksCapture = new DeadClicksAutocapture(\n this.instance,\n isDeadClicksEnabledForHeatmaps,\n this._onDeadClick.bind(this)\n )\n this._deadClicksCapture.startIfEnabledOrStop()\n\n this._onVisibilityChange_handler = this._onVisibilityChange.bind(this)\n addEventListener(document, DOM_EVENT_VISIBILITYCHANGE, this._onVisibilityChange_handler)\n\n this._initialized = true\n }\n\n private _removeListeners(): void {\n if (!window || !document) {\n return\n }\n\n if (this._flushHandler) {\n window.removeEventListener(DOM_EVENT_BEFOREUNLOAD, this._flushHandler)\n }\n\n if (this._onClickHandler) {\n document.removeEventListener('click', this._onClickHandler, { capture: true })\n }\n\n if (this._onMouseMoveHandler) {\n document.removeEventListener('mousemove', this._onMouseMoveHandler, { capture: true })\n }\n\n if (this._onVisibilityChange_handler) {\n document.removeEventListener(DOM_EVENT_VISIBILITYCHANGE, this._onVisibilityChange_handler)\n }\n\n clearTimeout(this._mouseMoveTimeout)\n\n this._deadClicksCapture?.stop()\n\n this._initialized = false\n }\n\n private _getProperties(e: MouseEvent, type: string): Properties {\n // We need to know if the target element is fixed or not\n // If fixed then we won't account for scrolling\n // If not then we will account for scrolling\n\n const scrollY = this.instance.scrollManager.scrollY()\n const scrollX = this.instance.scrollManager.scrollX()\n const scrollElement = this.instance.scrollManager.scrollElement()\n\n const isFixedOrSticky = elementOrParentPositionMatches(getEventTarget(e), ['fixed', 'sticky'], scrollElement)\n\n return {\n x: e.clientX + (isFixedOrSticky ? 0 : scrollX),\n y: e.clientY + (isFixedOrSticky ? 0 : scrollY),\n target_fixed: isFixedOrSticky,\n type,\n }\n }\n\n private _onClick(e: MouseEvent, type: string = 'click'): void {\n if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n return\n }\n\n const properties = this._getProperties(e, type)\n\n if (\n this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime()) &&\n shouldCaptureRageclick(getEventTarget(e), this.instance.config.rageclick)\n ) {\n this._capture({\n ...properties,\n type: 'rageclick',\n })\n }\n\n this._capture(properties)\n }\n\n private _onMouseMove(e: Event): void {\n if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n return\n }\n\n clearTimeout(this._mouseMoveTimeout)\n\n this._mouseMoveTimeout = setTimeout(() => {\n this._capture(this._getProperties(e as MouseEvent, 'mousemove'))\n }, 500)\n }\n\n private _capture(properties: Properties): void {\n if (!window) {\n return\n }\n\n const href = this._config.disable_capture_url_hashes ? stripUrlHash(window.location.href) : window.location.href\n\n // mask url query params\n const maskPersonalDataProperties = this._config.mask_personal_data_properties\n const customPersonalDataProperties = this._config.custom_personal_data_properties\n\n const paramsToMask = maskPersonalDataProperties\n ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n : []\n\n const url = maskQueryParams(href, paramsToMask, MASKED)\n\n this._buffer = this._buffer || {}\n\n if (!this._buffer[url]) {\n this._buffer[url] = []\n }\n\n this._buffer[url].push(properties)\n }\n\n private _flush(): void {\n if (!this._buffer || isEmptyObject(this._buffer)) {\n return\n }\n\n this.instance.capture('$$heatmap', {\n $heatmap_data: this.getAndClearBuffer(),\n })\n }\n}\n","import { PostHog } from './posthog-core'\nimport { ProductTour, ProductTourCallback } from './posthog-product-tours-types'\nimport { PRODUCT_TOURS, PRODUCT_TOURS_ENABLED_SERVER_SIDE } from './constants'\nimport { RemoteConfigResult } from './types'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { isArray, isNullish } from '@posthog/core'\nimport { assignableWindow } from './utils/globals'\nimport { Extension } from './extensions/types'\n\nconst logger = createLogger('[Product Tours]')\n\ninterface ProductTourManagerInterface {\n start: () => void\n stop: () => void\n showTourById: (tourId: string) => void\n previewTour: (tour: ProductTour) => void\n dismissTour: (reason: string) => void\n nextStep: () => void\n previousStep: () => void\n getActiveProductTours: (callback: ProductTourCallback) => void\n resetTour: (tourId: string) => void\n resetAllTours: () => void\n cancelPendingTour: (tourId: string) => void\n}\n\nconst isProductToursEnabled = (instance: PostHog): boolean => {\n if (instance.config.disable_product_tours) {\n return false\n }\n return !!instance.persistence?.get_property(PRODUCT_TOURS_ENABLED_SERVER_SIDE)\n}\n\nexport class PostHogProductTours implements Extension {\n private _instance: PostHog\n private _productTourManager: ProductTourManagerInterface | null = null\n private _cachedTours: ProductTour[] | null = null\n\n private get _persistence() {\n return this._instance.persistence\n }\n\n constructor(instance: PostHog) {\n this._instance = instance\n }\n\n initialize() {\n this.loadIfEnabled()\n }\n\n onRemoteConfig(result: RemoteConfigResult): void {\n if (!result.ok) {\n // Failure behaves like a response without a productTours key.\n return\n }\n\n const response = result.config\n if (!('productTours' in response)) {\n return\n }\n\n if (this._persistence) {\n this._persistence.register({\n [PRODUCT_TOURS_ENABLED_SERVER_SIDE]: !!response.productTours,\n })\n }\n if (!isProductToursEnabled(this._instance)) {\n if (this._productTourManager || !isNullish(this._persistence?.props[PRODUCT_TOURS])) {\n logger.info('product tours disabled; stopping and clearing cached tours')\n }\n // a manager started from the previously-persisted enabled flag keeps\n // serving tours until told to stop\n this._productTourManager?.stop()\n this._productTourManager = null\n // tours cached while enabled would otherwise ride along in the main\n // persistence blob (and every cross-tab storage broadcast) forever\n this.clearCache()\n return\n }\n this.loadIfEnabled()\n }\n\n loadIfEnabled(): void {\n if (this._productTourManager || !isProductToursEnabled(this._instance)) {\n return\n }\n this._loadScript(() => this._startProductTours())\n }\n\n private _loadScript(cb: () => void): void {\n if (assignableWindow.__PosthogExtensions__?.generateProductTours) {\n cb()\n return\n }\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'product-tours', (err) => {\n if (err) {\n logger.error('Could not load product tours script', err)\n return\n }\n cb()\n })\n }\n\n private _startProductTours(): void {\n if (this._productTourManager || !assignableWindow.__PosthogExtensions__?.generateProductTours) {\n return\n }\n this._productTourManager = assignableWindow.__PosthogExtensions__.generateProductTours(this._instance, true)\n }\n\n getProductTours(callback: ProductTourCallback, forceReload: boolean = false): void {\n if (isArray(this._cachedTours) && !forceReload) {\n callback(this._cachedTours, { isLoaded: true })\n return\n }\n\n const persistence = this._persistence\n if (persistence) {\n const storedTours = persistence.props[PRODUCT_TOURS]\n if (isArray(storedTours) && !forceReload) {\n this._cachedTours = storedTours\n callback(storedTours, { isLoaded: true })\n return\n }\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/product_tours/?token=${this._instance.config.token}`\n ),\n method: 'GET',\n timestampMode: 'query',\n callback: (response) => {\n if (!isProductToursEnabled(this._instance)) {\n // a disable can land while this request is in flight; honouring\n // the response would re-create the cache the disable just cleared\n callback([], { isLoaded: true })\n return\n }\n const statusCode = response.statusCode\n if (statusCode !== 200 || !response.json) {\n const error = `Product Tours API could not be loaded, status: ${statusCode}`\n logger.error(error)\n callback([], { isLoaded: false, error })\n return\n }\n\n const tours: ProductTour[] = isArray(response.json.product_tours) ? response.json.product_tours : []\n this._cachedTours = tours\n\n if (persistence) {\n persistence.register({ [PRODUCT_TOURS]: tours })\n }\n\n callback(tours, { isLoaded: true })\n },\n })\n }\n\n getActiveProductTours(callback: ProductTourCallback): void {\n if (isNullish(this._productTourManager)) {\n callback([], { isLoaded: false, error: 'Product tours not loaded' })\n return\n }\n this._productTourManager.getActiveProductTours(callback)\n }\n\n showProductTour(tourId: string): void {\n this._productTourManager?.showTourById(tourId)\n }\n\n // force load product tours extension and render a tour,\n // ignoring all display conditions.\n previewTour(tour: ProductTour): void {\n if (this._productTourManager) {\n this._productTourManager.previewTour(tour)\n return\n }\n\n this._loadScript(() => {\n this._startProductTours()\n this._productTourManager?.previewTour(tour)\n })\n }\n\n dismissProductTour(): void {\n this._productTourManager?.dismissTour('user_clicked_skip')\n }\n\n nextStep(): void {\n this._productTourManager?.nextStep()\n }\n\n previousStep(): void {\n this._productTourManager?.previousStep()\n }\n\n clearCache(): void {\n this._cachedTours = null\n this._persistence?.unregister(PRODUCT_TOURS)\n }\n\n resetTour(tourId: string): void {\n this._productTourManager?.resetTour(tourId)\n }\n\n resetAllTours(): void {\n this._productTourManager?.resetAllTours()\n }\n\n cancelPendingTour(tourId: string): void {\n this._productTourManager?.cancelPendingTour(tourId)\n }\n}\n","import type { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport { isNull } from '@posthog/core'\nimport { CaptureResult, Properties, RemoteConfigResult, SiteApp, SiteAppGlobals, SiteAppLoader } from './types'\nimport { document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nconst logger = createLogger('[SiteApps]')\nconst APP_INIT_ERROR = 'Error while initializing PostHog app with config id '\n\nexport class SiteApps implements Extension {\n apps: Record<string, SiteApp>\n\n private _stopBuffering?: () => void\n private _bufferedInvocations: SiteAppGlobals[]\n private _siteAppElementPatchCount = 0\n private _restoreSiteAppElementPatches?: () => void\n\n constructor(private _instance: PostHog) {\n // events captured between loading posthog-js and the site app; up to 1000 events\n this._bufferedInvocations = []\n this.apps = {}\n }\n\n public get isEnabled(): boolean {\n return !!this._instance.config.opt_in_site_apps\n }\n\n private _eventCollector(_eventName: string, eventPayload?: CaptureResult | undefined) {\n if (!eventPayload) {\n return\n }\n const globals = this.globalsForEvent(eventPayload)\n this._bufferedInvocations.push(globals)\n if (this._bufferedInvocations.length > 1000) {\n this._bufferedInvocations = this._bufferedInvocations.slice(10)\n }\n }\n\n get siteAppLoaders(): SiteAppLoader[] | undefined {\n return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.siteApps\n }\n\n initialize() {\n if (this.isEnabled) {\n const stop = this._instance._addCaptureHook(this._eventCollector.bind(this))\n this._stopBuffering = () => {\n stop()\n this._bufferedInvocations = []\n this._stopBuffering = undefined\n }\n }\n }\n\n globalsForEvent(event: CaptureResult): SiteAppGlobals {\n if (!event) {\n throw new Error('Event payload is required')\n }\n const groups: SiteAppGlobals['groups'] = {}\n const groupIds = this._instance.get_property('$groups') || []\n const groupProperties: Record<string, Properties> =\n this._instance.get_property('$stored_group_properties') || {}\n for (const [type, properties] of Object.entries(groupProperties)) {\n groups[type] = { id: groupIds[type], type, properties }\n }\n const { $set_once, $set, ..._event } = event\n const globals = {\n event: {\n ..._event,\n properties: {\n ...event.properties,\n ...($set ? { $set: { ...(event.properties?.$set ?? {}), ...$set } } : {}),\n ...($set_once ? { $set_once: { ...(event.properties?.$set_once ?? {}), ...$set_once } } : {}),\n },\n elements_chain: event.properties?.['$elements_chain'] ?? '',\n // TODO:\n // - elements_chain_href: '',\n // - elements_chain_texts: [] as string[],\n // - elements_chain_ids: [] as string[],\n // - elements_chain_elements: [] as string[],\n distinct_id: event.properties?.['distinct_id'],\n },\n person: {\n properties: this._instance.get_property('$stored_person_properties'),\n },\n groups,\n }\n return globals\n }\n\n private _prepareElementForSiteApp<T extends Node>(element: T): T | null {\n const tagName = (element as unknown as Element).tagName?.toLowerCase()\n if (tagName === 'style' && this._instance.config.prepare_external_dependency_stylesheet) {\n const prepared = this._instance.config.prepare_external_dependency_stylesheet(\n element as Node as HTMLStyleElement\n )\n if (!prepared) {\n logger.error('prepare_external_dependency_stylesheet returned null')\n return null\n }\n return prepared as Node as T\n }\n if (tagName === 'script' && this._instance.config.prepare_external_dependency_script) {\n const prepared = this._instance.config.prepare_external_dependency_script(\n element as Node as HTMLScriptElement\n )\n if (!prepared) {\n logger.error('prepare_external_dependency_script returned null')\n return null\n }\n return prepared as Node as T\n }\n return element\n }\n\n private _patchSiteAppElementInsertionMethods(): () => void {\n if (\n !this._instance.config.prepare_external_dependency_stylesheet &&\n !this._instance.config.prepare_external_dependency_script\n ) {\n return () => {}\n }\n\n const win = document?.defaultView\n const nodePrototype = win?.Node?.prototype\n if (!win || !nodePrototype) {\n return () => {}\n }\n\n this._siteAppElementPatchCount++\n\n if (this._restoreSiteAppElementPatches) {\n return this._releaseSiteAppElementPatches()\n }\n\n const restore: (() => void)[] = []\n const siteApps = this\n const preparedNodes = new WeakSet<Node>()\n const patch = (\n prototype: Record<string, any> | undefined,\n method: string,\n replacement: (original: (...args: any[]) => any) => (...args: any[]) => any\n ) => {\n if (!prototype?.[method]) {\n return\n }\n const original = prototype[method]\n prototype[method] = replacement(original)\n restore.push(() => {\n prototype[method] = original\n })\n }\n const prepareNode = <N extends Node>(node: N): N | null => {\n if (preparedNodes.has(node)) {\n return node\n }\n const prepared = siteApps._prepareElementForSiteApp(node)\n if (prepared) {\n preparedNodes.add(prepared)\n }\n return prepared\n }\n const prepareNodes = (nodes: (Node | string)[]): (Node | string)[] =>\n nodes\n .map((node) => (typeof node === 'string' ? node : prepareNode(node)))\n .filter((node): node is Node | string => !isNull(node))\n\n patch(\n nodePrototype,\n 'appendChild',\n (original) =>\n function (this: Node, child: Node) {\n const prepared = prepareNode(child)\n return prepared ? original.call(this, prepared) : child\n }\n )\n patch(\n nodePrototype,\n 'insertBefore',\n (original) =>\n function (this: Node, newChild: Node, refChild: Node | null) {\n const prepared = prepareNode(newChild)\n return prepared ? original.call(this, prepared, refChild) : newChild\n }\n )\n patch(\n nodePrototype,\n 'replaceChild',\n (original) =>\n function (this: Node, newChild: Node, oldChild: Node) {\n const prepared = prepareNode(newChild)\n return prepared ? original.call(this, prepared, oldChild) : oldChild\n }\n )\n ;[win.Element?.prototype, win.Document?.prototype, win.DocumentFragment?.prototype].forEach((prototype) => {\n patch(\n prototype,\n 'append',\n (original) =>\n function (this: ParentNode, ...nodes: (Node | string)[]) {\n return original.apply(this, prepareNodes(nodes))\n }\n )\n patch(\n prototype,\n 'prepend',\n (original) =>\n function (this: ParentNode, ...nodes: (Node | string)[]) {\n return original.apply(this, prepareNodes(nodes))\n }\n )\n })\n ;[win.Element?.prototype, win.CharacterData?.prototype, win.DocumentType?.prototype].forEach((prototype) => {\n patch(\n prototype,\n 'before',\n (original) =>\n function (this: ChildNode, ...nodes: (Node | string)[]) {\n return original.apply(this, prepareNodes(nodes))\n }\n )\n patch(\n prototype,\n 'after',\n (original) =>\n function (this: ChildNode, ...nodes: (Node | string)[]) {\n return original.apply(this, prepareNodes(nodes))\n }\n )\n patch(\n prototype,\n 'replaceWith',\n (original) =>\n function (this: ChildNode, ...nodes: (Node | string)[]) {\n const prepared = prepareNodes(nodes)\n return nodes.length && !prepared.length ? undefined : original.apply(this, prepared)\n }\n )\n })\n patch(\n win.Element?.prototype,\n 'insertAdjacentElement',\n (original) =>\n function (this: Element, position: InsertPosition, insertedElement: Element) {\n const prepared = prepareNode(insertedElement)\n return prepared ? original.call(this, position, prepared) : null\n }\n )\n\n this._restoreSiteAppElementPatches = () => {\n restore.forEach((restore) => restore())\n this._restoreSiteAppElementPatches = undefined\n }\n\n return this._releaseSiteAppElementPatches()\n }\n\n private _releaseSiteAppElementPatches(): () => void {\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this._siteAppElementPatchCount--\n if (this._siteAppElementPatchCount === 0) {\n this._restoreSiteAppElementPatches?.()\n }\n }\n }\n\n private _runWithPreparedSiteAppElements<T>(callback: (restore: () => void) => T, restoreSynchronously = true): T {\n const restore = this._patchSiteAppElementInsertionMethods()\n try {\n const result = callback(restore)\n if (restoreSynchronously) {\n restore()\n }\n return result\n } catch (e) {\n restore()\n throw e\n }\n }\n\n setupSiteApp(loader: SiteAppLoader) {\n const app = this.apps[loader.id]\n const processBufferedEvents = () => {\n if (!app.errored && this._bufferedInvocations.length) {\n logger.info(`Processing ${this._bufferedInvocations.length} events for site app with id ${loader.id}`)\n this._bufferedInvocations.forEach((globals) =>\n this._runWithPreparedSiteAppElements(() => app.processEvent?.(globals))\n )\n app.processedBuffer = true\n }\n\n if (Object.values(this.apps).every((app) => app.processedBuffer || app.errored)) {\n this._stopBuffering?.()\n }\n }\n\n let hasInitReturned = false\n const onLoaded = (success: boolean) => {\n app.errored = !success\n app.loaded = true\n logger.info(`Site app with id ${loader.id} ${success ? 'loaded' : 'errored'}`)\n // ensure that we don't call processBufferedEvents until after init() returns and we've set up processEvent\n if (hasInitReturned) {\n processBufferedEvents()\n }\n }\n\n try {\n const { processEvent } = this._runWithPreparedSiteAppElements(\n (restore) =>\n loader.init({\n posthog: this._instance,\n callback: (success) => {\n restore()\n onLoaded(success)\n },\n }),\n false\n )\n if (processEvent) {\n app.processEvent = processEvent\n }\n hasInitReturned = true\n } catch (e) {\n logger.error(APP_INIT_ERROR + loader.id, e)\n onLoaded(false)\n }\n\n // if the app loaded synchronously, process the events now\n if (hasInitReturned && app.loaded) {\n try {\n processBufferedEvents()\n } catch (e) {\n logger.error(`Error while processing buffered events PostHog app with config id ${loader.id}`, e)\n app.errored = true\n }\n }\n }\n\n private _setupSiteApps() {\n const siteAppLoaders = this.siteAppLoaders || []\n\n // do this in 2 passes, so that this.apps is populated before we call init\n for (const loader of siteAppLoaders) {\n this.apps[loader.id] = {\n id: loader.id,\n loaded: false,\n errored: false,\n processedBuffer: false,\n }\n }\n for (const loader of siteAppLoaders) {\n this.setupSiteApp(loader)\n }\n }\n\n private _onCapturedEvent(event: CaptureResult) {\n if (Object.keys(this.apps).length === 0) {\n return\n }\n\n const globals = this.globalsForEvent(event)\n\n for (const app of Object.values(this.apps)) {\n try {\n this._runWithPreparedSiteAppElements(() => app.processEvent?.(globals))\n } catch (e) {\n logger.error(`Error while processing event ${event.event} for site app ${app.id}`, e)\n }\n }\n }\n\n onRemoteConfig(result: RemoteConfigResult): void {\n if (this.siteAppLoaders?.length) {\n if (!this.isEnabled) {\n logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n return\n }\n\n this._setupSiteApps()\n\n // NOTE: We could improve this to only fire if we actually have listeners for the event\n this._instance.on('eventCaptured', (event) => this._onCapturedEvent(event))\n\n return\n }\n\n // NOTE: Below this is now only the fallback for legacy site app support. Once we have fully removed to the remote config loader we can get rid of this\n\n this._stopBuffering?.()\n\n // On a failed fetch there are no legacy site apps to load; buffering has\n // already been stopped above, same as for a response without site apps.\n if (!result.ok) {\n return\n }\n\n const response = result.config\n if (!response['siteApps']?.length) {\n return\n }\n\n if (!this.isEnabled) {\n logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n return\n }\n\n for (const { id, url } of response['siteApps']) {\n assignableWindow[`__$$ph_site_app_${id}`] = this._instance\n assignableWindow.__PosthogExtensions__?.loadSiteApp?.(this._instance, url, (err) => {\n if (err) {\n return logger.error(APP_INIT_ERROR + id, err)\n }\n })\n }\n }\n}\n","import { isNullish } from \"@posthog/core\";\nfunction extractHref(elementsChain) {\n const match = elementsChain.match(/(?::|\")href=\"(.*?)\"/);\n return match ? match[1] : '';\n}\nfunction extractTexts(elementsChain) {\n const texts = [];\n const regex = /(?::|\")text=\"(.*?)\"/g;\n let match;\n while(!isNullish(match = regex.exec(elementsChain)))if (!texts.includes(match[1])) texts.push(match[1]);\n return texts;\n}\nfunction matchString(value, pattern, matching) {\n if (isNullish(value)) return false;\n switch(matching){\n case 'exact':\n return value === pattern;\n case 'contains':\n {\n const likePattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/_/g, '.').replace(/%/g, '.*');\n return new RegExp(likePattern, 'i').test(value);\n }\n case 'regex':\n try {\n return new RegExp(pattern).test(value);\n } catch {\n return false;\n }\n default:\n return false;\n }\n}\nfunction matchTexts(texts, pattern, matching) {\n return texts.some((text)=>matchString(text, pattern, matching));\n}\nexport { extractHref, extractTexts, matchString, matchTexts };\n","import { PostHog } from '../../posthog-core'\nimport { ActionStepType, PropertyFilters, SurveyActionType, SurveyElement } from '../../posthog-surveys-types'\nimport { SimpleEventEmitter } from '@posthog/browser-common/utils/simple-event-emitter'\nimport { CaptureResult, PropertyMatchType } from '../../types'\nimport { isArray, isUndefined } from '@posthog/core'\nimport { matchPropertyFilters } from '@posthog/browser-common/utils/property-utils'\nimport { extractTexts, extractHref, matchString, matchTexts } from '@posthog/browser-common/utils/elements-chain-utils'\n\nexport class ActionMatcher {\n private readonly _actionRegistry?: Set<SurveyActionType>\n private readonly _instance?: PostHog\n private readonly _actionEvents: Set<string>\n private _debugEventEmitter = new SimpleEventEmitter()\n\n constructor(instance?: PostHog) {\n this._instance = instance\n this._actionEvents = new Set<string>()\n this._actionRegistry = new Set<SurveyActionType>()\n }\n\n init() {\n if (!isUndefined(this._instance?._addCaptureHook)) {\n const matchEventToAction = (eventName: string, eventPayload: any) => {\n this.on(eventName, eventPayload)\n }\n this._instance?._addCaptureHook(matchEventToAction)\n }\n }\n\n register(actions: SurveyActionType[]): void {\n if (isUndefined(this._instance?._addCaptureHook)) {\n return\n }\n\n actions.forEach((action) => {\n this._actionRegistry?.add(action)\n action.steps?.forEach((step) => {\n this._actionEvents?.add(step?.event || '')\n })\n })\n\n if (this._instance?.autocapture) {\n const selectorsToWatch: Set<string> = new Set<string>()\n actions.forEach((action) => {\n action.steps?.forEach((step) => {\n if (step?.selector) {\n selectorsToWatch.add(step?.selector)\n }\n })\n })\n this._instance?.autocapture.setElementSelectors(selectorsToWatch)\n }\n }\n\n on(eventName: string, eventPayload?: CaptureResult) {\n if (eventPayload == null || eventName.length == 0) {\n return\n }\n\n if (!this._actionEvents.has(eventName) && !this._actionEvents.has(eventPayload.event)) {\n return\n }\n\n if (this._actionRegistry && this._actionRegistry?.size > 0) {\n this._actionRegistry.forEach((action) => {\n if (this._checkAction(eventPayload, action)) {\n this._debugEventEmitter.emit('actionCaptured', action.name)\n }\n })\n }\n }\n\n _addActionHook(callback: (actionName: string, eventPayload?: any) => void): void {\n this.onAction('actionCaptured', (data) => callback(data))\n }\n\n private _checkAction(event?: CaptureResult, action?: SurveyActionType): boolean {\n if (action?.steps == null) {\n return false\n }\n\n for (const step of action.steps) {\n if (this._checkStep(event, step)) {\n return true\n }\n }\n\n return false\n }\n\n onAction(event: 'actionCaptured', cb: (...args: any[]) => void): () => void {\n return this._debugEventEmitter.on(event, cb)\n }\n\n private _checkStep = (event?: CaptureResult, step?: ActionStepType): boolean => {\n return (\n this._checkStepEvent(event, step) &&\n this._checkStepUrl(event, step) &&\n this._checkStepElement(event, step) &&\n this._checkStepProperties(event, step)\n )\n }\n\n private _checkStepEvent = (event?: CaptureResult, step?: ActionStepType): boolean => {\n // CHECK CONDITIONS, OTHERWISE SKIPPED\n if (step?.event && event?.event !== step?.event) {\n return false // EVENT NAME IS A MISMATCH\n }\n return true\n }\n\n private _checkStepUrl(event?: CaptureResult, step?: ActionStepType): boolean {\n // CHECK CONDITIONS, OTHERWISE SKIPPED\n if (step?.url) {\n const eventUrl = event?.properties?.$current_url\n if (!eventUrl || typeof eventUrl !== 'string') {\n return false\n }\n if (!matchString(eventUrl, step.url, step.url_matching || 'contains')) {\n return false\n }\n }\n return true\n }\n\n private _checkStepElement(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!this._checkStepHref(event, step)) return false\n if (!this._checkStepText(event, step)) return false\n if (!this._checkStepSelector(event, step)) return false\n return true\n }\n\n private _checkStepHref(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.href) return true\n\n const elements = this._getElementsList(event)\n if (elements.length > 0) {\n return elements.some((el) => matchString(el.href, step.href!, step.href_matching || 'exact'))\n }\n\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (chain) {\n return matchString(extractHref(chain), step.href, step.href_matching || 'exact')\n }\n\n return false\n }\n\n private _checkStepText(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.text) return true\n\n const elements = this._getElementsList(event)\n if (elements.length > 0) {\n return elements.some(\n (el) =>\n matchString(el.text, step.text!, step.text_matching || 'exact') ||\n matchString(el.$el_text, step.text!, step.text_matching || 'exact')\n )\n }\n\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (chain) {\n return matchTexts(extractTexts(chain), step.text, step.text_matching || 'exact')\n }\n\n return false\n }\n\n private _checkStepSelector(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.selector) return true\n\n // check exact match on $element_selectors from autocapture\n const elementSelectors = event?.properties?.$element_selectors as string[] | undefined\n if (elementSelectors?.includes(step.selector)) {\n return true\n }\n\n // check against compiled regex\n const chain = (event?.properties?.$elements_chain as string) || ''\n if (step.selector_regex && chain) {\n try {\n return new RegExp(step.selector_regex).test(chain)\n } catch {\n return false\n }\n }\n\n return false\n }\n\n private _getElementsList(event?: CaptureResult): SurveyElement[] {\n if (event?.properties?.$elements == null) {\n return []\n }\n\n return event?.properties.$elements as unknown as SurveyElement[]\n }\n\n private _checkStepProperties(event?: CaptureResult, step?: ActionStepType): boolean {\n if (!step?.properties || step.properties.length === 0) {\n return true\n }\n\n // transform to match same property format as normal events\n const propertyFilters: PropertyFilters = step.properties.reduce<PropertyFilters>((acc, filter) => {\n const values = isArray(filter.value)\n ? filter.value.map(String)\n : filter.value != null\n ? [String(filter.value)]\n : []\n\n acc[filter.key] = {\n values,\n operator: (filter.operator || 'exact') as PropertyMatchType,\n }\n return acc\n }, {})\n\n return matchPropertyFilters(propertyFilters, event?.properties)\n }\n}\n","import { SurveyActionType, SurveyEventType, SurveyEventWithFilters } from '../posthog-surveys-types'\nimport { ActionMatcher } from '../extensions/surveys/action-matcher'\nimport { PostHog } from '../posthog-core'\nimport { CaptureResult } from '../types'\nimport { matchPropertyFilters } from '@posthog/browser-common/utils/property-utils'\nimport { isUndefined } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\n/**\n * Interface for items that can be triggered by events/actions.\n * Both Survey and ProductTour implement this interface.\n */\nexport interface EventTriggerable {\n id: string\n conditions?: {\n events?: { repeatedActivation?: boolean; values: SurveyEventWithFilters[] } | null\n cancelEvents?: { values: SurveyEventWithFilters[] } | null\n actions?: { values: SurveyActionType[] } | null\n } | null\n}\n\n/**\n * What a captured lifecycle event (shown / dismissed / sent) does to an already-activated item:\n * - `consume`: it's done — drop it from both the in-memory and persisted sets.\n * - `persist`: it was shown and should survive a reload — move it from memory into persistence.\n * - `ignore`: no transition for this item on this event.\n */\nexport type ActivationOutcome = 'consume' | 'persist' | 'ignore'\n\n/**\n * Abstract base class for receiving events and matching them to triggerable items.\n * Subclasses implement type-specific behavior for surveys and product tours.\n */\nexport abstract class EventReceiver<T extends EventTriggerable> {\n // eventToItems is a mapping of event name to all the items that are activated by it\n protected _eventToItems: Map<string, string[]>\n // cancelEventToItems is a mapping of event name to all the items that should be cancelled by it\n protected _cancelEventToItems: Map<string, string[]>\n // actionToItems is a mapping of action name to all the items that are activated by it\n protected readonly _actionToItems: Map<string, string[]>\n // actionMatcher can look at CaptureResult payloads and match an event to its corresponding action.\n protected _actionMatcher?: ActionMatcher | null\n protected readonly _instance?: PostHog\n /**\n * Items armed by an event or action but not yet shown live here, in memory only.\n * They are intentionally NOT persisted, so they do not survive a page reload: an\n * event trigger only displays an item in the session the event fired in. Once an\n * item is shown, surviving items are promoted into persistence (see `onEvent`) so\n * a reload re-reads and re-displays them until the user interacts — but that\n * persisted activation is scoped to the triggering session (see\n * `_getPersistedActivatedIds`), so it does not leak into a brand-new session where\n * the trigger never fired.\n */\n private _pendingActivatedItems: string[] = []\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._eventToItems = new Map<string, string[]>()\n this._cancelEventToItems = new Map<string, string[]>()\n this._actionToItems = new Map<string, string[]>()\n\n // A persisted activation belongs to the session the item was shown in. When the session\n // rotates (idle timeout, max length, cross-tab adoption) the trigger did not fire in the\n // new session, so the activation is stale and must be dropped. We subscribe to rotations\n // here rather than relying only on reading the session id on the display path: that read\n // is read-only and so cannot observe an idle-expired session (and must not force a\n // rotation, since merely checking whether to show a survey should never keep a session\n // alive). The read-time check in `_getPersistedActivatedIds` remains as a complementary\n // backstop for a session that had already rotated in persistence before this page loaded.\n this._instance?.onSessionId?.((sessionId) => this._onSessionIdChanged(sessionId))\n }\n\n // Abstract methods for subclasses to implement\n protected abstract _getActivatedKey(): string\n /** Persistence key under which the session id of the persisted activation set is stamped. */\n protected abstract _getActivatedSessionKey(): string\n protected abstract _getShownEventName(): string\n protected abstract _getItems(callback: (items: T[]) => void): void\n protected abstract _cancelPendingItem(itemId: string): void\n protected abstract _getLogger(): ReturnType<typeof createLogger>\n protected abstract _setActivatedItems(eligibleItems: string[]): void\n /** Persist the session id the current activation set belongs to. */\n protected abstract _setActivatedSession(sessionId: string): void\n /** Forget the persisted session stamp. */\n protected abstract _clearActivatedSession(): void\n /** Check if item is permanently ineligible (e.g. completed/dismissed). Skip adding to activated list. */\n protected abstract _isItemPermanentlyIneligible(itemId?: string): boolean\n\n /**\n * Decide what a captured lifecycle `event` does to an already-activated `itemId`. Most items are\n * consumed when shown (so they only reappear when their trigger fires again). Surveys keep\n * non-repeatable ones activated — promoting them to session-scoped persistence on shown — until the\n * user dismisses or answers them, so an event-triggered survey survives a reload within the\n * triggering session (but not a brand-new session) until it's actually interacted with.\n */\n protected abstract _activationOutcome(event: string, itemId: string): ActivationOutcome\n\n private _doesEventMatchFilter(\n eventConfig: SurveyEventWithFilters | undefined,\n eventPayload?: CaptureResult\n ): boolean {\n if (!eventConfig) {\n return false\n }\n\n return matchPropertyFilters(eventConfig.propertyFilters, eventPayload?.properties)\n }\n\n private _buildEventToItemMap(items: T[], conditionField: SurveyEventType): Map<string, string[]> {\n const map = new Map<string, string[]>()\n items.forEach((item) => {\n item.conditions?.[conditionField]?.values?.forEach((event) => {\n if (event?.name) {\n const existing = map.get(event.name) || []\n existing.push(item.id)\n map.set(event.name, existing)\n }\n })\n })\n return map\n }\n\n /**\n * build a map of (Event1) => [Item1, Item2, Item3]\n * used for items that should be [activated|cancelled] by Event1\n */\n private _getMatchingItems(\n eventName: string,\n eventPayload: CaptureResult | undefined,\n conditionField: SurveyEventType\n ): T[] {\n const itemIdMap = conditionField === SurveyEventType.Activation ? this._eventToItems : this._cancelEventToItems\n const itemIds = itemIdMap.get(eventName)\n\n let items: T[] = []\n this._getItems((allItems) => {\n items = allItems.filter((item) => itemIds?.includes(item.id))\n })\n\n return items.filter((item) => {\n const eventConfig = item.conditions?.[conditionField]?.values?.find((e) => e.name === eventName)\n return this._doesEventMatchFilter(eventConfig, eventPayload)\n })\n }\n\n register(items: T[]): void {\n if (isUndefined(this._instance?._addCaptureHook)) {\n return\n }\n\n this._setupEventBasedItems(items)\n this._setupActionBasedItems(items)\n }\n\n private _setupActionBasedItems(items: T[]) {\n const actionBasedItems = items.filter(\n (item: T) => item.conditions?.actions && item.conditions?.actions?.values?.length > 0\n )\n\n if (actionBasedItems.length === 0) {\n return\n }\n\n if (this._actionMatcher == null) {\n this._actionMatcher = new ActionMatcher(this._instance)\n this._actionMatcher.init()\n // match any actions to its corresponding item.\n const matchActionToItem = (actionName: string) => {\n this.onAction(actionName)\n }\n\n this._actionMatcher._addActionHook(matchActionToItem)\n }\n\n actionBasedItems.forEach((item) => {\n if (\n item.conditions &&\n item.conditions?.actions &&\n item.conditions?.actions?.values &&\n item.conditions?.actions?.values?.length > 0\n ) {\n // register the known set of actions with\n // the action-matcher so it can match\n // events to actions\n this._actionMatcher?.register(item.conditions.actions.values)\n\n // maintain a mapping of (Action1) => [Item1, Item2, Item3]\n // where Items 1-3 are all activated by Action1\n item.conditions?.actions?.values?.forEach((action) => {\n if (action && action.name) {\n const knownItems: string[] | undefined = this._actionToItems.get(action.name)\n if (knownItems) {\n knownItems.push(item.id)\n }\n this._actionToItems.set(action.name, knownItems || [item.id])\n }\n })\n }\n })\n }\n\n private _setupEventBasedItems(items: T[]) {\n const eventBasedItems = items.filter(\n (item: T) => item.conditions?.events && item.conditions?.events?.values?.length > 0\n )\n\n const itemsWithCancelEvents = items.filter(\n (item: T) => item.conditions?.cancelEvents && item.conditions?.cancelEvents?.values?.length > 0\n )\n\n if (eventBasedItems.length === 0 && itemsWithCancelEvents.length === 0) {\n return\n }\n\n // match any events to its corresponding item.\n const matchEventToItem = (eventName: string, eventPayload?: CaptureResult) => {\n this.onEvent(eventName, eventPayload)\n }\n this._instance?._addCaptureHook(matchEventToItem)\n\n this._eventToItems = this._buildEventToItemMap(items, SurveyEventType.Activation)\n this._cancelEventToItems = this._buildEventToItemMap(items, SurveyEventType.Cancellation)\n }\n\n onEvent(event: string, eventPayload?: CaptureResult): void {\n const logger = this._getLogger()\n\n // An item reacting to one of its own lifecycle events (shown / dismissed / sent).\n const itemId = eventPayload?.properties?.$survey_id || eventPayload?.properties?.$product_tour_id\n if (itemId && this.getActivatedIds().includes(itemId)) {\n const outcome = this._activationOutcome(event, itemId)\n if (outcome === 'consume') {\n logger.info('event consumed activated item, removing it', { event, itemId })\n this._deactivateItems([itemId])\n return\n }\n if (outcome === 'persist') {\n logger.info('shown item promoted to persisted activation', { event, itemId })\n this._persistActivation(itemId)\n return\n }\n // 'ignore': no activation transition for this item on this event — fall through.\n }\n\n // check if this event should cancel any pending items\n if (this._cancelEventToItems.has(event)) {\n const itemsToCancel = this._getMatchingItems(event, eventPayload, SurveyEventType.Cancellation)\n\n if (itemsToCancel.length > 0) {\n logger.info('cancel event matched, cancelling items', {\n event,\n itemsToCancel: itemsToCancel.map((s) => s.id),\n })\n\n this._deactivateItems(itemsToCancel.map((item) => item.id))\n // cancel any pending timeout for these items\n itemsToCancel.forEach((item) => this._cancelPendingItem(item.id))\n }\n }\n\n // if the event is not in the eventToItems map, nothing else to do\n if (!this._eventToItems.has(event)) {\n return\n }\n\n logger.info('event name matched', {\n event,\n eventPayload,\n items: this._eventToItems.get(event),\n })\n\n const matchedItems = this._getMatchingItems(event, eventPayload, SurveyEventType.Activation)\n this._activateItems(matchedItems.map((item) => item.id))\n }\n\n onAction(actionName: string): void {\n if (this._actionToItems.has(actionName)) {\n this._activateItems(this._actionToItems.get(actionName) || [])\n }\n }\n\n /** Arm items in memory only (not persisted) until they are shown. */\n private _activateItems(itemIds: string[]): void {\n if (itemIds.length === 0) {\n return\n }\n this._pendingActivatedItems = [...new Set([...this._pendingActivatedItems, ...itemIds])]\n this._getLogger().info('updating activated items', { activatedItems: this.getActivatedIds() })\n }\n\n /**\n * Move an in-memory activation into persistence so it survives a page reload within the\n * triggering session. The set is (re)stamped with the current session id; reading it back\n * via `_getPersistedActivatedIds` discards it once the session rolls over. Because we build\n * on top of the session-scoped read, a stale set left over from a previous session is\n * dropped here rather than accumulated.\n */\n private _persistActivation(itemId: string): void {\n this._pendingActivatedItems = this._pendingActivatedItems.filter((id) => id !== itemId)\n const persisted = this._getPersistedActivatedIds()\n if (!persisted.includes(itemId)) {\n this._setActivatedItems([...persisted, itemId])\n this._stampActivationSession()\n }\n }\n\n /** Drop items from both the in-memory and persisted activation sets. */\n private _deactivateItems(itemIds: string[]): void {\n const remove = new Set(itemIds)\n this._pendingActivatedItems = this._pendingActivatedItems.filter((id) => !remove.has(id))\n const persisted = this._getRawPersistedActivatedIds()\n const nextPersisted = persisted.filter((id) => !remove.has(id))\n if (nextPersisted.length !== persisted.length) {\n this._setActivatedItems(nextPersisted)\n if (nextPersisted.length === 0) {\n this._clearActivationSession()\n }\n }\n }\n\n /** The raw persisted set as stored, ignoring session scoping. */\n private _getRawPersistedActivatedIds(): string[] {\n const activatedKey = this._getActivatedKey()\n const existingActivatedItems = this._instance?.persistence?.props[activatedKey]\n return existingActivatedItems ? existingActivatedItems : []\n }\n\n /**\n * The persisted activations that still belong to the current session. A persisted activation\n * is scoped to the session the item was shown in: an event/action trigger only earns a display\n * in the session it fired in, so once the session rolls over the activation is stale and must\n * not silently re-display the item in a brand-new session where the trigger never fired.\n */\n private _getPersistedActivatedIds(): string[] {\n const ids = this._getRawPersistedActivatedIds()\n if (ids.length === 0) {\n return []\n }\n const stampedSessionId = this._instance?.persistence?.props[this._getActivatedSessionKey()]\n // Read-only: this catches a session that had already rotated in persistence before this\n // page loaded (the stamped id no longer matches the current one). It intentionally does\n // NOT force a rotation of an idle-expired session — that case is handled by the\n // `onSessionId` subscription in the constructor, which clears the activation when the\n // session actually rotates on the next real event.\n const currentSessionId = this._instance?.get_session_id?.()\n // No resolvable session (e.g. cookieless mode) → treat the activation as un-scopable and\n // do not carry it across a reload.\n if (!currentSessionId || stampedSessionId !== currentSessionId) {\n return []\n }\n return ids\n }\n\n /** Stamp the persisted activation set with the current session id. */\n private _stampActivationSession(): void {\n const currentSessionId = this._instance?.get_session_id?.()\n if (currentSessionId) {\n this._setActivatedSession(currentSessionId)\n }\n }\n\n /** Forget the session stamp once nothing is persisted under it. */\n private _clearActivationSession(): void {\n this._clearActivatedSession()\n }\n\n /**\n * Drop a persisted activation once the session it was stamped under is no longer current.\n * Fired on session rotation (idle timeout, max length, cross-tab adoption) — the cases the\n * read-only session read on the display path cannot observe.\n */\n private _onSessionIdChanged(sessionId: string): void {\n const stampedSessionId = this._instance?.persistence?.props[this._getActivatedSessionKey()]\n if (stampedSessionId && stampedSessionId !== sessionId) {\n if (this._getRawPersistedActivatedIds().length > 0) {\n this._setActivatedItems([])\n }\n this._clearActivationSession()\n }\n }\n\n getActivatedIds(): string[] {\n // The activated set is the union of in-memory (armed, not yet shown) and persisted\n // (shown and surviving) items. In-memory ones do not survive a reload by design.\n const all = [...new Set([...this._getPersistedActivatedIds(), ...this._pendingActivatedItems])]\n return all.filter((itemId) => !this._isItemPermanentlyIneligible(itemId))\n }\n\n /**\n * Clear all activations. Called on `posthog.reset()` so a logout or account switch\n * (without a full page reload) does not leave an event-armed item live for the next\n * user — the in-memory set would otherwise survive `persistence.clear()`.\n */\n reset(): void {\n this._pendingActivatedItems = []\n if (this._getRawPersistedActivatedIds().length > 0) {\n this._setActivatedItems([])\n }\n this._clearActivationSession()\n }\n\n getEventToItemsMap(): Map<string, string[]> {\n return this._eventToItems\n }\n\n _getActionMatcher(): ActionMatcher | null | undefined {\n return this._actionMatcher\n }\n}\n","import { canSurveyActivateRepeatedly } from '@posthog/core/surveys'\nimport { SURVEYS_ACTIVATED, SURVEYS_ACTIVATED_SESSION } from '../constants'\nimport { Survey, SurveyEventName } from '../posthog-surveys-types'\nimport { PostHog } from '../posthog-core'\nimport { SURVEY_LOGGER as logger } from './survey-utils'\nimport { ActivationOutcome, EventReceiver } from './event-receiver'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\n\nexport class SurveyEventReceiver extends EventReceiver<Survey> {\n constructor(instance: PostHog) {\n super(instance)\n }\n\n protected _getActivatedKey(): string {\n return SURVEYS_ACTIVATED\n }\n\n protected _getActivatedSessionKey(): string {\n return SURVEYS_ACTIVATED_SESSION\n }\n\n protected _getShownEventName(): string {\n return SurveyEventName.SHOWN\n }\n\n protected _getItems(callback: (items: Survey[]) => void): void {\n this._instance?.getSurveys(callback)\n }\n\n protected _cancelPendingItem(itemId: string): void {\n this._instance?.cancelPendingSurvey(itemId)\n }\n\n protected _getLogger(): ReturnType<typeof createLogger> {\n return logger\n }\n\n protected _setActivatedItems(eligibleItems: string[]): void {\n this._instance?.persistence?.register({ [SURVEYS_ACTIVATED]: eligibleItems })\n }\n\n protected _setActivatedSession(sessionId: string): void {\n this._instance?.persistence?.register({ [SURVEYS_ACTIVATED_SESSION]: sessionId })\n }\n\n protected _clearActivatedSession(): void {\n this._instance?.persistence?.unregister(SURVEYS_ACTIVATED_SESSION)\n }\n\n protected _isItemPermanentlyIneligible(): boolean {\n // Surveys have complex eligibility rules checked at display time\n // For now, we don't filter at activation time\n return false\n }\n\n protected _activationOutcome(event: string, itemId: string): ActivationOutcome {\n let survey: Survey | undefined\n this._getItems((surveys) => {\n survey = surveys.find((s) => s.id === itemId)\n })\n\n // A repeatable survey (or one we can't resolve yet) shows once per trigger, so it's consumed\n // when shown. A non-repeatable survey is instead promoted to persistence on shown — so it\n // survives a reload — and only consumed once the user dismisses or answers it.\n const consumedOnShown = !survey || canSurveyActivateRepeatedly(survey)\n if (consumedOnShown) {\n return event === SurveyEventName.SHOWN ? 'consume' : 'ignore'\n }\n if (event === SurveyEventName.SHOWN) {\n return 'persist'\n }\n return event === SurveyEventName.DISMISSED || event === SurveyEventName.SENT ? 'consume' : 'ignore'\n }\n\n // Backward compatibility - keep getSurveys() as alias for getActivatedIds()\n getSurveys(): string[] {\n return this.getActivatedIds()\n }\n\n // Backward compatibility - keep getEventToSurveys() as alias\n getEventToSurveys(): Map<string, string[]> {\n return this.getEventToItemsMap()\n }\n}\n","import {\n LOAD_EXT_NOT_FOUND,\n SURVEYS,\n SURVEYS_CACHE_TTL_MS,\n SURVEYS_LOADED_AT,\n SURVEYS_REFRESH_BACKOFF_MS,\n} from './constants'\n\nconst SURVEY_NOT_LOADED = 'SDK is not enabled or survey functionality is not yet loaded'\nconst SURVEY_DISABLED = 'Disabled. Not loading surveys.'\nimport { SurveyManager } from './extensions/surveys'\nimport type { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport {\n DisplaySurveyOptions,\n DisplaySurveyType,\n Survey,\n SurveyCallback,\n SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { Properties, RemoteConfigResult } from './types'\nimport { document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\nimport { SurveyEventReceiver } from './utils/survey-event-receiver'\nimport {\n doesSurveyActivateByAction,\n doesSurveyActivateByEvent,\n IN_APP_SURVEY_TYPES,\n isSurveyRunning,\n setSurveySeenOnLocalStorage,\n SURVEY_LOGGER as logger,\n SURVEY_IN_PROGRESS_PREFIX,\n SURVEY_SEEN_PREFIX,\n} from './utils/survey-utils'\nimport { isNullish, isUndefined, isArray, isNumber } from '@posthog/core'\n\nexport class PostHogSurveys implements Extension {\n // this is set to undefined until the remote config is loaded\n // then it's set to true if there are surveys to load\n // or false if there are no surveys to load\n // or false if the surveys feature is disabled in the project settings\n private _isSurveysEnabled?: boolean = undefined\n public _surveyEventReceiver: SurveyEventReceiver | null\n private _surveyManager: SurveyManager | null = null\n private _isInitializingSurveys: boolean = false\n private _surveyCallbacks: SurveyCallback[] = []\n // Promise for in-flight survey fetch - allows multiple callers to await the same request\n private _getSurveysInFlightPromise: Promise<{\n surveys: Survey[]\n context: { isLoaded: boolean; error?: string }\n }> | null = null\n // Backs off the stale-cache refresh for one TTL after a failure, so a surveys-API outage can't\n // turn the ~1s display poll into a per-poll request storm.\n private _lastSurveyRefreshFailedAt: number | null = null\n\n private get _config() {\n return this._instance.config\n }\n\n constructor(private readonly _instance: PostHog) {\n // we set this to undefined here because we need the persistence storage for this type\n // but that's not initialized until loadIfEnabled is called.\n this._surveyEventReceiver = null\n }\n\n initialize() {\n this.loadIfEnabled()\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n // only load surveys if they are enabled and there are surveys to load\n if (this._config.disable_surveys) {\n return\n }\n\n if (!result.ok) {\n // Failure behaves like a response without a surveys key: not loaded.\n return logger.warn('Remote config unavailable. Not loading surveys.')\n }\n\n const surveys = result.config['surveys']\n if (isNullish(surveys)) {\n return logger.warn('Flags not loaded yet. Not loading surveys.')\n }\n const isArrayResponse = isArray(surveys)\n this._isSurveysEnabled = isArrayResponse ? surveys.length > 0 : surveys\n logger.info(`flags response received, isSurveysEnabled: ${this._isSurveysEnabled}`)\n this.loadIfEnabled()\n }\n\n reset(): void {\n try {\n // Drop in-memory event/action activations too; they aren't in persistence (which\n // reset() has already cleared), so without this an armed-but-unshown survey would\n // survive a logout/account switch that doesn't reload the page.\n this._surveyEventReceiver?.reset()\n localStorage.removeItem('lastSeenSurveyDate')\n const surveyKeys = []\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key?.startsWith(SURVEY_SEEN_PREFIX) || key?.startsWith(SURVEY_IN_PROGRESS_PREFIX)) {\n surveyKeys.push(key)\n }\n }\n\n surveyKeys.forEach((key) => localStorage.removeItem(key))\n } catch {\n // localStorage is not always available (e.g. in cross-origin iframes); resetting survey state is best-effort.\n }\n }\n\n loadIfEnabled() {\n // Initial guard clauses\n if (this._surveyManager) {\n return\n } // Already loaded\n if (this._isInitializingSurveys) {\n logger.info('Already initializing surveys, skipping...')\n return\n }\n if (this._config.disable_surveys) {\n logger.info(SURVEY_DISABLED)\n return\n }\n if (this._config.cookieless_mode && this._instance.consent.isOptedOut()) {\n logger.info('Not loading surveys in cookieless mode without consent.')\n return\n }\n\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n logger.error('PostHog Extensions not found.')\n return\n }\n\n // waiting for remote config to load\n // if surveys is forced enable (like external surveys), ignore the remote config and load surveys\n if (isUndefined(this._isSurveysEnabled) && !this._config.advanced_enable_surveys) {\n return\n }\n\n const isSurveysEnabled = this._isSurveysEnabled || this._config.advanced_enable_surveys\n\n this._isInitializingSurveys = true\n\n try {\n const generateSurveys = phExtensions.generateSurveys\n if (generateSurveys) {\n // Surveys code is already loaded\n this._completeSurveyInitialization(generateSurveys, isSurveysEnabled)\n return\n }\n\n // If we reach here, surveys code is not loaded yet\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n // Cannot load surveys code\n this._handleSurveyLoadError(LOAD_EXT_NOT_FOUND)\n return\n }\n\n // If we reach here, we need to load the dependency\n loadExternalDependency(this._instance, 'surveys', (err) => {\n if (err || !phExtensions.generateSurveys) {\n this._handleSurveyLoadError('Could not load surveys script', err)\n } else {\n // Need to get the function reference again inside the callback\n this._completeSurveyInitialization(phExtensions.generateSurveys, isSurveysEnabled)\n }\n })\n } catch (e) {\n this._handleSurveyLoadError('Error initializing surveys', e)\n throw e\n } finally {\n // Ensure the flag is always reset\n this._isInitializingSurveys = false\n }\n }\n\n /** Helper to finalize survey initialization */\n private _completeSurveyInitialization(\n generateSurveysFn: (instance: PostHog, isSurveysEnabled: boolean) => any,\n isSurveysEnabled: boolean\n ): void {\n this._surveyManager = generateSurveysFn(this._instance, isSurveysEnabled)\n this._surveyEventReceiver = new SurveyEventReceiver(this._instance)\n logger.info('Surveys loaded successfully')\n this._notifySurveyCallbacks({ isLoaded: true })\n }\n\n /** Helper to handle errors during survey loading */\n private _handleSurveyLoadError(message: string, error?: any): void {\n logger.error(message, error)\n this._notifySurveyCallbacks({ isLoaded: false, error: message })\n }\n\n /**\n * Register a callback that runs when surveys are initialized.\n * ### Usage:\n *\n * posthog.onSurveysLoaded((surveys) => {\n * // You can work with all surveys\n * console.log('All available surveys:', surveys)\n *\n * // Or get active matching surveys\n * posthog.getActiveMatchingSurveys((activeMatchingSurveys) => {\n * if (activeMatchingSurveys.length > 0) {\n * posthog.renderSurvey(activeMatchingSurveys[0].id, '#survey-container')\n * }\n * })\n * })\n *\n * @param {Function} callback The callback function will be called when surveys are loaded or updated.\n * It receives the array of all surveys and a context object with error status.\n * @returns {Function} A function that can be called to unsubscribe the listener.\n */\n onSurveysLoaded(callback: SurveyCallback): () => void {\n this._surveyCallbacks.push(callback)\n\n if (this._surveyManager) {\n this._notifySurveyCallbacks({\n isLoaded: true,\n })\n }\n // Return unsubscribe function\n return () => {\n this._surveyCallbacks = this._surveyCallbacks.filter((cb: SurveyCallback) => cb !== callback)\n }\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n // In case we manage to load the surveys script, but config says not to load surveys\n // then we shouldn't return survey data\n if (this._config.disable_surveys) {\n logger.info(SURVEY_DISABLED)\n return callback([])\n }\n\n const existingSurveys = this._instance.get_property(SURVEYS)\n if (existingSurveys && !forceReload) {\n // Serve the cached definitions synchronously so callers that rely on a synchronous\n // callback (e.g. _getSurveyById) keep working.\n callback(existingSurveys, {\n isLoaded: true,\n })\n // If the cache has aged past its TTL, kick off a background refresh so server-side\n // changes (e.g. a survey switched from popover to API) reach a long-lived tab. The\n // next poll then evaluates the refreshed definitions.\n if (this._shouldBackgroundRefreshSurveys()) {\n this.getSurveys(() => {}, true)\n }\n return\n }\n\n // If a fetch is already in progress and Promise is available, reuse that promise\n // In browsers without Promise (IE11), we skip this optimization and just make concurrent requests\n if (typeof Promise !== 'undefined' && this._getSurveysInFlightPromise) {\n this._getSurveysInFlightPromise.then(({ surveys, context }) => callback(surveys, context))\n return\n }\n\n // Create a new promise for this fetch that other callers can reuse\n // We need to assign the promise before starting the request, because\n // in tests (and potentially in some edge cases) the callback may fire synchronously\n let resolvePromise: (value: { surveys: Survey[]; context: { isLoaded: boolean; error?: string } }) => void\n if (typeof Promise !== 'undefined') {\n this._getSurveysInFlightPromise = new Promise((resolve) => {\n resolvePromise = resolve\n })\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor('api', `/api/surveys/?token=${this._config.token}`),\n method: 'GET',\n timestampMode: 'query',\n timeout: this._config.surveys_request_timeout_ms,\n callback: (response) => {\n this._getSurveysInFlightPromise = null\n\n const statusCode = response.statusCode\n if (statusCode !== 200 || !response.json) {\n const error = `Surveys API could not be loaded, status: ${statusCode}`\n logger.error(error)\n this._lastSurveyRefreshFailedAt = Date.now()\n const context = { isLoaded: false, error }\n callback([], context)\n resolvePromise?.({ surveys: [], context })\n return\n }\n this._lastSurveyRefreshFailedAt = null\n const surveys = response.json.surveys || []\n\n const eventOrActionBasedSurveys = surveys.filter(\n (survey: Survey) =>\n isSurveyRunning(survey) &&\n (doesSurveyActivateByEvent(survey) || doesSurveyActivateByAction(survey))\n )\n\n if (eventOrActionBasedSurveys.length > 0) {\n this._surveyEventReceiver?.register(eventOrActionBasedSurveys)\n }\n\n // Stamp when these definitions were fetched so the split-storage\n // loader can tell a fresher main-blob write-back from a stale\n // `__surveys` entry (the survey analogue of $feature_flag_evaluated_at).\n this._instance.persistence?.register({ [SURVEYS]: surveys, [SURVEYS_LOADED_AT]: Date.now() })\n const context = { isLoaded: true }\n callback(surveys, context)\n resolvePromise?.({ surveys, context })\n },\n })\n }\n\n /**\n * Whether to kick off a background refresh of the cached definitions: the cache is stale, no\n * fetch is already in flight, and we're not backing off after a recent failure.\n */\n private _shouldBackgroundRefreshSurveys(): boolean {\n return this._isSurveyCacheStale() && !this._getSurveysInFlightPromise && !this._isSurveyRefreshBackingOff()\n }\n\n /**\n * Whether the cached `$surveys` definitions have aged past their TTL. Returns false when no\n * timestamp is recorded (e.g. surveys injected directly in tests) so the cache stays valid.\n */\n private _isSurveyCacheStale(): boolean {\n const surveysLoadedAt = this._instance.get_property(SURVEYS_LOADED_AT)\n return isNumber(surveysLoadedAt) && Date.now() - surveysLoadedAt > SURVEYS_CACHE_TTL_MS\n }\n\n private _isSurveyRefreshBackingOff(): boolean {\n return (\n isNumber(this._lastSurveyRefreshFailedAt) &&\n Date.now() - this._lastSurveyRefreshFailedAt < SURVEYS_REFRESH_BACKOFF_MS\n )\n }\n\n /**\n * Marks a survey as seen for the current device, mirroring the local state the SDK records\n * when it shows or sends a survey itself.\n *\n * Use this when you display surveys through your own backend/integration (so the SDK never\n * captures the `survey shown`/`sent`/`dismissed` events) and still want PostHog's display\n * logic to honour the \"already seen\" and wait-period checks on subsequent page loads.\n *\n * Note: surveys configured to repeat (`schedule: 'always'` or event `repeatedActivation`)\n * intentionally bypass the seen check, so marking them as seen will not stop them showing.\n *\n * @param surveyId The ID of the survey to mark as seen.\n * @param options Optional settings. `iteration` is the survey's current iteration number, if any.\n */\n markSurveyAsSeen(surveyId: string, options?: { iteration?: number | null }): void {\n const survey = { id: surveyId, current_iteration: options?.iteration ?? null }\n setSurveySeenOnLocalStorage(survey)\n try {\n localStorage.setItem('lastSeenSurveyDate', new Date().toISOString())\n } catch {\n // localStorage is not always available (e.g. in cross-origin iframes); best-effort only.\n }\n }\n\n /** Helper method to notify all registered callbacks */\n private _notifySurveyCallbacks(context: { isLoaded: boolean; error?: string }): void {\n for (const callback of this._surveyCallbacks) {\n try {\n if (!context.isLoaded) {\n return callback([], context)\n }\n this.getSurveys(callback)\n } catch (error) {\n logger.error('Error in survey callback', error)\n }\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n return this._surveyManager.getActiveMatchingSurveys(callback, forceReload)\n }\n\n private _getSurveyById(surveyId: string): Survey | null {\n let survey: Survey | null = null\n this.getSurveys((surveys) => {\n survey = surveys.find((x) => x.id === surveyId) ?? null\n })\n return survey\n }\n\n private _checkSurveyEligibility(surveyId: string | Survey): { eligible: boolean; reason?: string } {\n if (isNullish(this._surveyManager)) {\n return { eligible: false, reason: SURVEY_NOT_LOADED }\n }\n const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n if (!survey) {\n return { eligible: false, reason: 'Survey not found' }\n }\n return this._surveyManager.checkSurveyEligibility(survey)\n }\n\n canRenderSurvey(surveyId: string | Survey): SurveyRenderReason {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return { visible: false, disabledReason: SURVEY_NOT_LOADED }\n }\n const eligibility = this._checkSurveyEligibility(surveyId)\n\n return { visible: eligibility.eligible, disabledReason: eligibility.reason }\n }\n\n canRenderSurveyAsync(surveyId: string, forceReload: boolean): Promise<SurveyRenderReason> {\n // Ensure surveys are loaded before checking\n // Using Promise to wrap the callback-based getSurveys method\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return Promise.resolve({\n visible: false,\n disabledReason: SURVEY_NOT_LOADED,\n })\n }\n\n // eslint-disable-next-line compat/compat\n return new Promise<SurveyRenderReason>((resolve) => {\n this.getSurveys((surveys) => {\n const survey = surveys.find((x) => x.id === surveyId) ?? null\n if (!survey) {\n resolve({ visible: false, disabledReason: 'Survey not found' })\n } else {\n const eligibility = this._checkSurveyEligibility(survey)\n resolve({ visible: eligibility.eligible, disabledReason: eligibility.reason })\n }\n }, forceReload)\n })\n }\n\n renderSurvey(surveyId: string | Survey, selector: string, properties?: Properties) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n if (!survey?.id) {\n logger.warn('Survey not found')\n return\n }\n if (!IN_APP_SURVEY_TYPES.includes(survey.type)) {\n logger.warn(`Surveys of type ${survey.type} cannot be rendered in the app`)\n return\n }\n const elem = document?.querySelector(selector)\n if (!elem) {\n logger.warn('Survey element not found')\n return\n }\n if (survey.appearance?.surveyPopupDelaySeconds) {\n logger.info(\n `Rendering survey ${survey.id} with delay of ${survey.appearance.surveyPopupDelaySeconds} seconds`\n )\n setTimeout(() => {\n logger.info(\n `Rendering survey ${survey.id} with delay of ${survey.appearance?.surveyPopupDelaySeconds} seconds`\n )\n this._surveyManager?.renderSurvey(survey, elem, properties)\n logger.info(`Survey ${survey.id} rendered`)\n }, survey.appearance.surveyPopupDelaySeconds * 1000)\n return\n }\n this._surveyManager.renderSurvey(survey, elem, properties)\n }\n\n displaySurvey(surveyId: string, options: DisplaySurveyOptions) {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n const survey = this._getSurveyById(surveyId)\n if (!survey) {\n logger.warn('Survey not found')\n return\n }\n let surveyToDisplay = survey\n if (survey.appearance?.surveyPopupDelaySeconds && options.ignoreDelay) {\n surveyToDisplay = {\n ...survey,\n appearance: {\n ...survey.appearance,\n surveyPopupDelaySeconds: 0,\n },\n }\n }\n if (options.displayType !== DisplaySurveyType.Popover && options.initialResponses) {\n logger.warn('initialResponses is only supported for popover surveys. prefill will not be applied.')\n }\n if (options.ignoreConditions === false) {\n const canRender = this.canRenderSurvey(survey)\n if (!canRender.visible) {\n logger.warn('Survey is not eligible to be displayed: ', canRender.disabledReason)\n return\n }\n }\n if (options.displayType === DisplaySurveyType.Inline) {\n this.renderSurvey(surveyToDisplay, options.selector, options.properties)\n return\n }\n this._surveyManager.handlePopoverSurvey(surveyToDisplay, options)\n }\n\n cancelPendingSurvey(surveyId: string): void {\n if (isNullish(this._surveyManager)) {\n logger.warn('init was not called')\n return\n }\n this._surveyManager.cancelSurvey(surveyId)\n }\n\n handlePageUnload(): void {\n this._surveyManager?.handlePageUnload?.()\n }\n}\n","import { addEventListener, trySafe, isToolbarInstance } from '@posthog/browser-common/utils/general-utils'\nimport { PostHog } from '../posthog-core'\nimport { ToolbarParams } from '../types'\nimport { _getHashParam } from '@posthog/browser-common/utils/request-utils'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { window, document } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from '../utils/globals'\nimport { TOOLBAR_ID } from '@posthog/browser-common/constants'\nimport { isFunction, isNullish } from '@posthog/core'\nimport { Extension } from './types'\n\n// TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.\n// To get ahead of this we grab it as soon as the posthog-js is parsed\nconst STATE_FROM_WINDOW = window?.location\n ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n : null\n\nconst LOCALSTORAGE_KEY = '_postHogToolbarParams'\n\nconst logger = createLogger('[Toolbar]')\n\nconst ToolbarState = { UNINITIALIZED: 0, LOADING: 1, LOADED: 2 } as const\ntype ToolbarState = (typeof ToolbarState)[keyof typeof ToolbarState]\n\nexport class Toolbar implements Extension {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n // NOTE: We store the state of the toolbar in the global scope to avoid multiple instances of the SDK loading the toolbar\n private _setToolbarState(state: ToolbarState) {\n assignableWindow['ph_toolbar_state'] = state\n }\n\n private _getToolbarState(): ToolbarState {\n return assignableWindow['ph_toolbar_state'] ?? ToolbarState.UNINITIALIZED\n }\n\n initialize(): boolean {\n return this.maybeLoadToolbar()\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n // don't load the toolbar on the toolbar :)\n if (isToolbarInstance(this.instance.config)) {\n return false\n }\n if (!window || !document) {\n return false\n }\n location = location ?? window.location\n history = history ?? window.history\n\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window?.localStorage\n }\n\n /**\n * Info about the state\n * The state is a json object\n * 1. (Legacy) The state can be `state={}` as a urlencoded object of info. In this case\n * 2. The state should now be found in `__posthog={}` and can be base64 encoded or urlencoded.\n * 3. Base64 encoding is preferred and will gradually be rolled out everywhere\n */\n\n const stateHash =\n STATE_FROM_WINDOW || _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n\n let toolbarParams: ToolbarParams\n const state = stateHash\n ? trySafe(() => JSON.parse(atob(decodeURIComponent(stateHash)))) ||\n trySafe(() => JSON.parse(decodeURIComponent(stateHash)))\n : null\n\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n // second param is unused see https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n history.replaceState(history.state, '', location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialization\n\n toolbarParams = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.config.token === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch {\n return false\n }\n }\n\n private _callLoadToolbar(params: ToolbarParams) {\n const loadFn = assignableWindow['ph_load_toolbar'] || assignableWindow['ph_load_editor']\n if (isNullish(loadFn) || !isFunction(loadFn)) {\n logger.warn('No toolbar load function found')\n return\n }\n loadFn(params, this.instance)\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n const toolbarRunning = !!document?.getElementById(TOOLBAR_ID)\n\n if (!window || toolbarRunning) {\n // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running\n return false\n }\n\n const disableToolbarMetrics =\n this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics\n\n const toolbarParams = {\n token: this.instance.config.token,\n ...params,\n apiURL: this.instance.requestRouter.endpointFor('ui'),\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n window.localStorage.setItem(\n LOCALSTORAGE_KEY,\n JSON.stringify({\n ...toolbarParams,\n source: undefined,\n })\n )\n\n if (this._getToolbarState() === ToolbarState.LOADED) {\n this._callLoadToolbar(toolbarParams)\n } else if (this._getToolbarState() === ToolbarState.UNINITIALIZED) {\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n this._setToolbarState(ToolbarState.LOADING)\n\n assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this.instance, 'toolbar', (err) => {\n if (err) {\n logger.error('[Toolbar] Failed to load', err)\n this._setToolbarState(ToolbarState.UNINITIALIZED)\n return\n }\n this._setToolbarState(ToolbarState.LOADED)\n this._callLoadToolbar(toolbarParams)\n })\n\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n addEventListener(window, 'turbolinks:load', () => {\n this._setToolbarState(ToolbarState.UNINITIALIZED)\n this.loadToolbar(toolbarParams)\n })\n }\n\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n","import { addEventListener, entries, extend } from '@posthog/browser-common/utils/general-utils'\nimport { PostHog } from './posthog-core'\nimport {\n FlagsResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n Compression,\n EarlyAccessFeature,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeatureStage,\n FeatureFlagDetail,\n FeatureFlagResult,\n FeatureFlagOptions,\n IsFeatureEnabledOptions,\n OverrideFeatureFlagsOptions,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\nimport type { Extension } from './extensions/types'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n DEVICE_ID,\n PERSISTENCE_ACTIVE_FEATURE_FLAGS,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n PERSISTENCE_FEATURE_FLAG_REQUEST_ID,\n PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n FLAG_CALL_REPORTED_SESSION_ID,\n PERSISTENCE_FEATURE_FLAG_PAYLOADS,\n PERSISTENCE_OVERRIDE_FEATURE_FLAGS,\n PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS,\n} from './constants'\n\nimport { isUndefined, isArray, isNull, getEnabledFromValue, getVariantFromValue, parsePayload } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { getTimezone } from '@posthog/browser-common/utils/event-utils'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport {\n isStatusZeroFailureCircuitBreakerTripped,\n updateStatusZeroFailureCount,\n} from '@posthog/browser-common/utils/request-utils'\n\nconst logger = createLogger('[FeatureFlags]')\nconst forceDebugLogger = createLogger('[FeatureFlags]', { debugEnabled: true })\nconst FLAG_TIMEOUT_MSG = '\" failed. Feature flags didn\\'t load in time.'\n// Mirrors the event retry queue's status-0 budget: repeated requests that die\n// before any HTTP response while the browser reports itself online are usually\n// deterministically blocked (ad blocker, CORS, extension). Stop periodic /flags\n// refreshes after this many consecutive failures until connectivity changes.\nconst MAX_CONSECUTIVE_FLAGS_STATUS_ZERO_FAILURES = 3\n\n/**\n * Error type constants for the $feature_flag_error property.\n *\n * These values are sent in analytics events to track flag evaluation failures.\n * They should not be changed without considering impact on existing dashboards\n * and queries that filter on these values.\n */\nexport const FeatureFlagError = {\n ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n FLAG_MISSING: 'flag_missing',\n QUOTA_LIMITED: 'quota_limited',\n TIMEOUT: 'timeout',\n CONNECTION_ERROR: 'connection_error',\n UNKNOWN_ERROR: 'unknown_error',\n apiError: (status: number | string) => `api_error_${status}`,\n} as const\n\n/** Converts an array of flag names to a Record where each flag is set to true. */\nconst arrayToFlagsRecord = (flags: string[]): Record<string, true> => {\n const flagsObj: Record<string, true> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n return flagsObj\n}\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFlagsResponse = (\n response: Partial<FlagsResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {},\n currentFlagDetails: Record<string, FeatureFlagDetail> = {},\n options?: { partialResponse?: boolean }\n) => {\n const normalizedResponse = normalizeFlagsResponse(response)\n const flagDetails = normalizedResponse.flags\n const featureFlags = normalizedResponse.featureFlags\n const flagPayloads = normalizedResponse.featureFlagPayloads\n\n if (!featureFlags) {\n return // <-- This early return means we don't update anything, which is good.\n }\n\n const requestId = response['requestId']\n const evaluatedAt = response['evaluatedAt']\n\n // using the v1 api\n if (isArray(featureFlags)) {\n logger.warn('v1 of the feature flags endpoint is deprecated. Please use the latest version.')\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (featureFlags) {\n for (let i = 0; i < featureFlags.length; i++) {\n $enabled_feature_flags[featureFlags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: featureFlags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n // Legacy responses never carry the gate — fail safe to full events.\n [PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS]: false,\n })\n return\n }\n\n // using the v2+ api\n let newFeatureFlags = featureFlags\n let newFeatureFlagPayloads = flagPayloads\n let newFeatureFlagDetails = flagDetails\n if (options?.partialResponse) {\n // The response is intentionally partial (e.g., only survey flags were requested via\n // advanced_only_evaluate_survey_feature_flags). Merge with existing flags so that\n // bootstrapped or previously loaded non-survey flags are preserved.\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n } else if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n // but filter out flags that failed to evaluate so they don't overwrite cached values\n if (flagDetails) {\n const successfulKeys = new Set(Object.keys(flagDetails).filter((key) => !flagDetails[key]?.failed))\n\n newFeatureFlags = {\n ...currentFlags,\n ...Object.fromEntries(Object.entries(newFeatureFlags).filter(([key]) => successfulKeys.has(key))),\n }\n newFeatureFlagPayloads = {\n ...currentFlagPayloads,\n ...Object.fromEntries(\n Object.entries(newFeatureFlagPayloads || {}).filter(([key]) => successfulKeys.has(key))\n ),\n }\n newFeatureFlagDetails = {\n ...currentFlagDetails,\n ...Object.fromEntries(\n Object.entries(newFeatureFlagDetails || {}).filter(([key]) => successfulKeys.has(key))\n ),\n }\n } else {\n // v1 responses don't have flagDetails, so we can't filter by failed field\n // Fall back to the original merge behavior\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n }\n }\n\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n [PERSISTENCE_FEATURE_FLAG_DETAILS]: newFeatureFlagDetails || {},\n // Overwritten on every flags response: an absent field flips the gate off, so\n // bootstrap/locally injected flags always fail safe to full events.\n [PERSISTENCE_MINIMAL_FLAG_CALLED_EVENTS]: response.minimalFlagCalledEvents === true,\n ...(requestId ? { [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: requestId } : {}),\n ...(evaluatedAt ? { [PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]: evaluatedAt } : {}),\n })\n}\n\nconst normalizeFlagsResponse = (response: Partial<FlagsResponse>): Partial<FlagsResponse> => {\n const flagDetails = response['flags']\n\n if (flagDetails) {\n // This is a /flags?v=2 request.\n\n // Map of flag keys to flag values: Record<string, string | boolean>\n response.featureFlags = Object.fromEntries(\n Object.keys(flagDetails).map((flag) => [flag, flagDetails[flag].variant ?? flagDetails[flag].enabled])\n )\n // Map of flag keys to flag payloads: Record<string, JsonType>\n response.featureFlagPayloads = Object.fromEntries(\n Object.keys(flagDetails)\n .filter((flag) => flagDetails[flag].enabled)\n .filter((flag) => flagDetails[flag].metadata?.payload)\n .map((flag) => [flag, flagDetails[flag].metadata?.payload])\n )\n } else if (response['featureFlags']) {\n // The response has no `flags` key but does carry top-level `featureFlags`, which is the\n // shape returned by older servers that don't understand `?v=2`. A valid v2 response with no\n // flags (e.g. a project without any feature flags) legitimately omits `flags`, so we must\n // not warn in that case.\n logger.warn(\n 'Using an older version of the feature flags endpoint. Please upgrade your PostHog server to the latest version'\n )\n }\n return response\n}\n\nexport const QuotaLimitedResource = {\n FeatureFlags: 'feature_flags',\n Recordings: 'recordings',\n} as const\nexport type QuotaLimitedResource = (typeof QuotaLimitedResource)[keyof typeof QuotaLimitedResource]\n\nexport class PostHogFeatureFlags implements Extension {\n _override_warning: boolean = false\n featureFlagEventHandlers: FeatureFlagsCallback[]\n $anon_distinct_id: string | undefined\n private _hasLoadedFlags: boolean = false\n private _requestInFlight: boolean = false\n private _reloadingDisabled: boolean = false\n private _additionalReloadRequested: boolean = false\n private _reloadDebouncer?: any\n private _flagsLoadedFromRemote: boolean = false\n private _hasLoggedDeprecationWarning: boolean = false\n private _staleCacheRefreshTriggered: boolean = false\n private _consecutiveStatusZeroFailures: number = 0\n\n constructor(private _instance: PostHog) {\n this.featureFlagEventHandlers = []\n if (window) {\n addEventListener(window, 'online', this._onOnline)\n }\n }\n\n private _onOnline = (): void => {\n const wasTripped = this._hasStatusZeroCircuitBreakerTripped()\n this._consecutiveStatusZeroFailures = 0\n if (wasTripped) {\n this.reloadFeatureFlags()\n }\n }\n\n destroy(): void {\n window?.removeEventListener('online', this._onOnline)\n }\n\n private get _config() {\n return this._instance.config\n }\n\n private get _persistence() {\n return this._instance.persistence\n }\n\n private _prop(key: string): any {\n return this._instance.get_property(key)\n }\n\n /**\n * Check if the feature flag cache is stale based on the configured TTL.\n */\n private _isCacheStale(): boolean {\n return this._persistence?._isFeatureFlagCacheStale(this._config.feature_flag_cache_ttl_ms) ?? false\n }\n\n /**\n * Triggers a debounced reload when cache staleness is first detected.\n * Returns true if cache is stale, false otherwise.\n */\n private _checkAndTriggerStaleRefresh(): boolean {\n if (!this._isCacheStale()) {\n return false\n }\n // Only trigger refresh once per stale period\n if (!this._staleCacheRefreshTriggered && !this._requestInFlight) {\n this._staleCacheRefreshTriggered = true\n logger.warn('Feature flag cache is stale, triggering refresh...')\n this.reloadFeatureFlags()\n }\n return true\n }\n\n private _getValidEvaluationEnvironments(): string[] {\n // Support both evaluation_contexts (new) and evaluation_environments (deprecated)\n const envs = this._config.evaluation_contexts ?? this._config.evaluation_environments\n\n // Log deprecation warning if using old field (only once)\n if (\n this._config.evaluation_environments &&\n !this._config.evaluation_contexts &&\n !this._hasLoggedDeprecationWarning\n ) {\n logger.warn(\n 'evaluation_environments is deprecated. Use evaluation_contexts instead. evaluation_environments will be removed in a future version.'\n )\n this._hasLoggedDeprecationWarning = true\n }\n\n if (!envs?.length) {\n return []\n }\n\n return envs.filter((env: string) => {\n const isValid = env && typeof env === 'string' && env.trim().length > 0\n if (!isValid) {\n logger.error('Invalid evaluation context found:', env, 'Expected non-empty string')\n }\n return isValid\n })\n }\n\n private _shouldIncludeEvaluationEnvironments(): boolean {\n return this._getValidEvaluationEnvironments().length > 0\n }\n\n private _getValidFlagKeys(): string[] | undefined {\n const flagKeys = this._config.flag_keys\n\n if (isUndefined(flagKeys)) {\n return undefined\n }\n\n if (!isArray(flagKeys)) {\n logger.error('Invalid flag_keys found:', flagKeys, 'Expected array of non-empty strings')\n return undefined\n }\n\n return flagKeys.filter((flagKey: string) => {\n const isValid = flagKey && typeof flagKey === 'string' && flagKey.trim().length > 0\n if (!isValid) {\n logger.error('Invalid flag key found:', flagKey, 'Expected non-empty string')\n }\n return isValid\n })\n }\n\n initialize() {\n const { config } = this._instance\n const bootstrapFlags = config.bootstrap?.featureFlags ?? {}\n const hasBootstrappedFlags = Object.keys(bootstrapFlags).length\n if (hasBootstrappedFlags) {\n const bootstrapPayloads = config.bootstrap?.featureFlagPayloads ?? {}\n const activeFlags = Object.keys(bootstrapFlags)\n .filter((flag) => !!bootstrapFlags[flag])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = bootstrapFlags[key] || false\n return res\n }, {})\n const featureFlagPayloads = Object.keys(bootstrapPayloads)\n .filter((key) => activeFlags[key])\n .reduce((res: Record<string, JsonType>, key) => {\n if (bootstrapPayloads[key]) {\n res[key] = bootstrapPayloads[key]\n }\n return res\n }, {})\n\n this.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n }\n }\n\n updateFlags(\n flags: Record<string, boolean | string>,\n payloads?: Record<string, JsonType>,\n options?: { merge?: boolean }\n ): void {\n // Merge against the raw stored flags/payloads, not the override-applied getters.\n const existingFlags: Record<string, boolean | string> = options?.merge\n ? (this._prop(ENABLED_FEATURE_FLAGS) ?? {})\n : {}\n const existingPayloads: Record<string, JsonType> = options?.merge\n ? (this._prop(PERSISTENCE_FEATURE_FLAG_PAYLOADS) ?? {})\n : {}\n const finalFlags: Record<string, boolean | string> = { ...existingFlags, ...flags }\n const finalPayloads: Record<string, JsonType> = { ...existingPayloads, ...payloads }\n\n // Convert simple flags to v4 format to avoid deprecation warning\n const flagDetails: Record<string, FeatureFlagDetail> = {}\n for (const [key, value] of Object.entries(finalFlags)) {\n flagDetails[key] = {\n key,\n enabled: getEnabledFromValue(value),\n variant: getVariantFromValue(value),\n reason: undefined,\n // id: 0 indicates manually injected flags (not from server evaluation)\n metadata: !isUndefined(finalPayloads?.[key])\n ? { id: 0, version: undefined, description: undefined, payload: finalPayloads[key] }\n : undefined,\n }\n }\n\n this.receivedFeatureFlags({\n flags: flagDetails,\n })\n }\n\n get hasLoadedFlags(): boolean {\n return this._hasLoadedFlags\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagsWithDetails(): Record<string, FeatureFlagDetail> {\n const flagDetails = this._prop(PERSISTENCE_FEATURE_FLAG_DETAILS)\n\n const overridenFlags = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n const overriddenPayloads = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads && !overridenFlags) {\n return flagDetails || {}\n }\n\n const finalDetails = extend({}, flagDetails || {})\n const overriddenKeys = [\n ...new Set([...Object.keys(overriddenPayloads || {}), ...Object.keys(overridenFlags || {})]),\n ]\n for (const key of overriddenKeys) {\n const originalDetail = finalDetails[key]\n const overrideFlagValue = overridenFlags?.[key]\n\n const finalEnabled = isUndefined(overrideFlagValue)\n ? (originalDetail?.enabled ?? false)\n : !!overrideFlagValue\n\n const overrideVariant = isUndefined(overrideFlagValue)\n ? originalDetail.variant\n : typeof overrideFlagValue === 'string'\n ? overrideFlagValue\n : undefined\n\n const overridePayload = overriddenPayloads?.[key]\n\n const overridenDetail = {\n ...originalDetail,\n enabled: finalEnabled,\n // If the flag is not enabled, the variant should be undefined, even if the original has a variant value.\n variant: finalEnabled ? (overrideVariant ?? originalDetail?.variant) : undefined,\n }\n\n // Keep track of the original enabled and variant values so we can send them in the $feature_flag_called event.\n // This will be helpful for debugging and for understanding the impact of overrides.\n if (finalEnabled !== originalDetail?.enabled) {\n overridenDetail.original_enabled = originalDetail?.enabled\n }\n\n if (overrideVariant !== originalDetail?.variant) {\n overridenDetail.original_variant = originalDetail?.variant\n }\n\n if (overridePayload) {\n overridenDetail.metadata = {\n ...originalDetail?.metadata,\n payload: overridePayload,\n original_payload: originalDetail?.metadata?.payload,\n }\n }\n\n finalDetails[key] = overridenDetail\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag details!', {\n flagDetails,\n overriddenPayloads,\n finalDetails,\n })\n this._override_warning = true\n }\n return finalDetails\n }\n\n getAllFeatureFlags(): FeatureFlagResult[] {\n const flagVariants = this.getFlagVariants()\n const payloads = this.getFlagPayloads()\n return Object.keys(flagVariants).map((key) => {\n const flagValue = flagVariants[key]\n return {\n key,\n enabled: getEnabledFromValue(flagValue),\n variant: getVariantFromValue(flagValue),\n payload: parsePayload(payloads[key]),\n }\n })\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this._prop(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n if (!this._override_warning) {\n logger.warn(' Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this._prop(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n const overriddenPayloads = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads) {\n return flagPayloads || {}\n }\n\n const finalPayloads = extend({}, flagPayloads || {})\n const overriddenKeys = Object.keys(overriddenPayloads)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalPayloads[overriddenKeys[i]] = overriddenPayloads[overriddenKeys[i]]\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag payloads!', {\n flagPayloads,\n overriddenPayloads,\n finalPayloads,\n })\n this._override_warning = true\n }\n return finalPayloads\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n */\n reloadFeatureFlags(): void {\n if (this._reloadingDisabled || this._config.advanced_disable_feature_flags) {\n // If reloading has been explicitly disabled then we don't want to do anything\n // Or if feature flags are disabled\n return\n }\n\n if (this._hasStatusZeroCircuitBreakerTripped()) {\n return\n }\n\n if (this._reloadDebouncer) {\n // If we're already in a debounce then we don't want to do anything\n return\n }\n\n // Emit event so consumers know flags are being reloaded\n this._instance._internalEventEmitter.emit('featureFlagsReloading', true)\n\n // Debounce multiple calls on the same tick\n this._reloadDebouncer = setTimeout(() => {\n this._callFlagsEndpoint()\n }, 5)\n }\n\n private _clearDebouncer(): void {\n clearTimeout(this._reloadDebouncer)\n this._reloadDebouncer = undefined\n }\n\n ensureFlagsLoaded(): void {\n if (this._hasLoadedFlags || this._requestInFlight || this._reloadDebouncer) {\n // If we are or have already loaded the flags then we don't want to do anything\n return\n }\n\n this.reloadFeatureFlags()\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this._reloadingDisabled = isPaused\n }\n\n _callFlagsEndpoint(options?: { disableFlags?: boolean }): void {\n // Ensure we don't have double queued /flags requests\n this._clearDebouncer()\n if (this._instance._shouldDisableFlags()) {\n // The way this is documented is essentially used to refuse to ever call the /flags endpoint.\n return\n }\n if (this._hasStatusZeroCircuitBreakerTripped()) {\n return\n }\n if (this._requestInFlight) {\n this._additionalReloadRequested = true\n return\n }\n const token = this._config.token\n const deviceId = this._prop(DEVICE_ID)\n\n const data: Record<string, any> = {\n token: token,\n distinct_id: this._instance.get_distinct_id(),\n groups: this._instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: {\n ...(this._persistence?.get_initial_props() || {}),\n ...(this._prop(STORED_PERSON_PROPERTIES_KEY) || {}),\n },\n group_properties: this._prop(STORED_GROUP_PROPERTIES_KEY),\n timezone: getTimezone(),\n }\n\n // Add device_id if available (handle cookieless mode where it's null)\n if (!isNull(deviceId) && !isUndefined(deviceId)) {\n data.$device_id = deviceId\n }\n\n if (options?.disableFlags || this._config.advanced_disable_feature_flags) {\n data.disable_flags = true\n }\n\n // Add evaluation contexts if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_contexts = this._getValidEvaluationEnvironments()\n }\n\n const flagKeys = this._getValidFlagKeys()\n if (!isUndefined(flagKeys)) {\n data.flag_keys = flagKeys\n }\n\n const queryParams = this._config.advanced_only_evaluate_survey_feature_flags\n ? '&only_evaluate_survey_feature_flags=true'\n : ''\n const isPartialFlagsResponse = !!this._config.advanced_only_evaluate_survey_feature_flags\n\n const url = this._instance.requestRouter.endpointFor('flags', '/flags/?v=2' + queryParams)\n\n this._requestInFlight = true\n this._instance._send_request({\n method: 'POST',\n url,\n data,\n compression: this._config.disable_compression ? undefined : Compression.Base64,\n timestampMode: 'body',\n timeout: this._config.feature_flag_request_timeout_ms,\n callback: (response) => {\n let errorsLoading = true\n this._trackStatusZeroReachability(response.statusCode)\n\n if (response.statusCode === 200) {\n // successful request\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n if (!this._additionalReloadRequested) {\n this.$anon_distinct_id = undefined\n }\n errorsLoading = false\n }\n\n this._requestInFlight = false\n\n if (data.disable_flags && !this._additionalReloadRequested) {\n // If flags are disabled then there is no need to call /flags again (flags are the only thing that may change)\n // UNLESS, an additional reload is requested.\n return\n }\n\n this._flagsLoadedFromRemote = !errorsLoading\n\n const flagErrors: string[] = []\n if (response.error) {\n if (response.error instanceof Error) {\n flagErrors.push(\n response.error.name === 'AbortError'\n ? FeatureFlagError.TIMEOUT\n : FeatureFlagError.CONNECTION_ERROR\n )\n } else {\n flagErrors.push(FeatureFlagError.UNKNOWN_ERROR)\n }\n } else if (response.statusCode !== 200) {\n flagErrors.push(FeatureFlagError.apiError(response.statusCode))\n }\n if (response.json?.errorsWhileComputingFlags) {\n flagErrors.push(FeatureFlagError.ERRORS_WHILE_COMPUTING)\n }\n const isQuotaLimited = !!response.json?.quotaLimited?.includes(QuotaLimitedResource.FeatureFlags)\n if (isQuotaLimited) {\n flagErrors.push(FeatureFlagError.QUOTA_LIMITED)\n }\n\n this._persistence?.register({\n [PERSISTENCE_FEATURE_FLAG_ERRORS]: flagErrors,\n })\n\n if (isQuotaLimited) {\n // log a warning and then early return\n logger.warn(\n 'You have hit your feature flags quota limit, and will not be able to load feature flags until the quota is reset. Please visit https://posthog.com/docs/billing/limits-alerts to learn more.'\n )\n return\n }\n\n if (!data.disable_flags) {\n this.receivedFeatureFlags(response.json ?? {}, errorsLoading, {\n partialResponse: isPartialFlagsResponse,\n })\n }\n\n if (this._additionalReloadRequested) {\n this._additionalReloadRequested = false\n this._callFlagsEndpoint()\n }\n },\n })\n }\n\n private _hasStatusZeroCircuitBreakerTripped(): boolean {\n return isStatusZeroFailureCircuitBreakerTripped(\n this._consecutiveStatusZeroFailures,\n MAX_CONSECUTIVE_FLAGS_STATUS_ZERO_FAILURES\n )\n }\n\n private _trackStatusZeroReachability(statusCode: number): void {\n this._consecutiveStatusZeroFailures = updateStatusZeroFailureCount(\n statusCode,\n this._consecutiveStatusZeroFailures,\n MAX_CONSECUTIVE_FLAGS_STATUS_ZERO_FAILURES,\n () =>\n logger.warn(\n 'Feature flag requests are failing before receiving an HTTP response; this can happen due to network issues, CORS, browser blocking, or ad blockers. Stopped refreshing feature flags; will try again when connectivity changes.'\n )\n )\n }\n\n /**\n * Get feature flag's value for user.\n *\n * By default, this method may return cached values from localStorage if the `/flags` endpoint\n * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n * (e.g., a flag that was disabled on the server).\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * // Only use fresh values from the server (returns undefined until /flags responds)\n * if(posthog.getFeatureFlag('my-flag', { fresh: true }) === 'some-variant') { // do something }\n *\n * @param {String} key Key of the feature flag.\n * @param {Object} options Optional settings.\n * @param {boolean} [options.send_event=true] If false, won't send a $feature_flag_called event to PostHog.\n * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n * Use this when you need to ensure the flag value reflects the current server state,\n * such as after disabling a flag. Returns undefined until the /flags endpoint responds.\n * @returns {boolean | string | undefined} The flag value, or undefined if not found or not yet loaded.\n */\n getFeatureFlag(key: string, options: FeatureFlagOptions = {}): boolean | string | undefined {\n if (options.fresh && !this._flagsLoadedFromRemote) {\n return undefined\n }\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlag for key \"' + key + FLAG_TIMEOUT_MSG)\n return undefined\n }\n // Check if cache is stale and trigger refresh if needed\n if (this._checkAndTriggerStaleRefresh()) {\n return undefined\n }\n const result = this.getFeatureFlagResult(key, options)\n return result?.variant ?? result?.enabled\n }\n\n /*\n * Retrieves the details for a feature flag.\n *\n * ### Usage:\n *\n * const details = getFeatureFlagDetails(\"my-flag\")\n * console.log(details.metadata.version)\n * console.log(details.reason)\n *\n * @param {String} key Key of the feature flag.\n */\n getFeatureFlagDetails(key: string): FeatureFlagDetail | undefined {\n const details = this.getFlagsWithDetails()\n return details[key]\n }\n\n /**\n * @deprecated Use `getFeatureFlagResult()` instead which properly tracks the feature flag call.\n * `getFeatureFlagPayload()` does not emit the `$feature_flag_called` event which may result in\n * missing analytics. This method will be removed in a future version.\n */\n getFeatureFlagPayload(key: string): JsonType {\n // Don't send event to maintain backwards compatibility - this method never tracked calls\n const result = this.getFeatureFlagResult(key, { send_event: false })\n return result?.payload\n }\n\n /**\n * Get a feature flag result including both the flag value and payload, while properly tracking the call.\n * This method emits the `$feature_flag_called` event by default.\n *\n * By default, this method may return cached values from localStorage if the `/flags` endpoint\n * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n * (e.g., a flag that was disabled on the server).\n *\n * ### Usage:\n *\n * const result = posthog.getFeatureFlagResult('my-flag')\n * if (result?.enabled) {\n * console.log('Flag is enabled with payload:', result.payload)\n * }\n *\n * // Only use fresh values from the server\n * const freshResult = posthog.getFeatureFlagResult('my-flag', { fresh: true })\n *\n * @param {String} key Key of the feature flag.\n * @param {Object} [options] Options for the feature flag lookup.\n * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n * Use this when you need to ensure the flag value reflects the current server state.\n * Returns undefined until the /flags endpoint responds.\n * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n */\n getFeatureFlagResult(key: string, options: FeatureFlagOptions = {}): FeatureFlagResult | undefined {\n if (options.fresh && !this._flagsLoadedFromRemote) {\n return undefined\n }\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlagResult for key \"' + key + FLAG_TIMEOUT_MSG)\n return undefined\n }\n // Check if cache is stale and trigger refresh if needed\n if (this._checkAndTriggerStaleRefresh()) {\n return undefined\n }\n\n const flagVariants = this.getFlagVariants()\n const flagExists = key in flagVariants\n const flagValue = flagVariants[key]\n const payloads = this.getFlagPayloads()\n const payload = payloads[key]\n const flagReportValue = String(flagValue)\n const requestId = this._prop(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined\n const evaluatedAt = this._prop(PERSISTENCE_FEATURE_FLAG_EVALUATED_AT) || undefined\n let flagCallReported: Record<string, string[]> = this._prop(FLAG_CALL_REPORTED) || {}\n\n // When session-scoped dedup is enabled, reset the reported flags whenever the session changes.\n if (this._config.advanced_feature_flags_dedup_per_session) {\n const currentSessionId = this._instance.get_session_id()\n const storedSessionId = this._prop(FLAG_CALL_REPORTED_SESSION_ID)\n if (currentSessionId && currentSessionId !== storedSessionId) {\n flagCallReported = {}\n this._persistence?.register({\n [FLAG_CALL_REPORTED]: flagCallReported,\n [FLAG_CALL_REPORTED_SESSION_ID]: currentSessionId,\n })\n }\n }\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this._persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n const flagDetails = this.getFeatureFlagDetails(key)\n const errors: string[] = [...(this._prop(PERSISTENCE_FEATURE_FLAG_ERRORS) ?? [])]\n if (isUndefined(flagValue)) {\n errors.push(FeatureFlagError.FLAG_MISSING)\n }\n\n const properties: Record<string, any | undefined> = {\n $feature_flag: key,\n $feature_flag_response: flagValue,\n $feature_flag_payload: payload || null,\n $feature_flag_request_id: requestId,\n $feature_flag_evaluated_at: evaluatedAt,\n $feature_flag_bootstrapped_response: this._config.bootstrap?.featureFlags?.[key] || null,\n $feature_flag_bootstrapped_payload: this._config.bootstrap?.featureFlagPayloads?.[key] || null,\n // If we haven't yet received a response from the /flags endpoint, we must have used the bootstrapped value\n $used_bootstrap_value: !this._flagsLoadedFromRemote,\n }\n\n if (!isUndefined(flagDetails?.metadata?.has_experiment)) {\n properties.$feature_flag_has_experiment = flagDetails.metadata.has_experiment\n }\n\n if (!isUndefined(flagDetails?.metadata?.version)) {\n properties.$feature_flag_version = flagDetails.metadata.version\n }\n\n const reason = flagDetails?.reason?.description ?? flagDetails?.reason?.code\n if (reason) {\n properties.$feature_flag_reason = reason\n }\n\n if (flagDetails?.metadata?.id) {\n properties.$feature_flag_id = flagDetails.metadata.id\n }\n\n // It's possible that flag values were overridden by calling overrideFeatureFlags.\n // We want to capture the original values in case someone forgets they were using overrides\n // and is wondering why their app is acting weird.\n if (!isUndefined(flagDetails?.original_variant) || !isUndefined(flagDetails?.original_enabled)) {\n properties.$feature_flag_original_response = !isUndefined(flagDetails.original_variant)\n ? flagDetails.original_variant\n : flagDetails.original_enabled\n }\n\n if (flagDetails?.metadata?.original_payload) {\n properties.$feature_flag_original_payload = flagDetails?.metadata?.original_payload\n }\n\n if (errors.length) {\n properties.$feature_flag_error = errors.join(',')\n }\n\n this._instance.capture('$feature_flag_called', properties)\n }\n }\n\n if (!flagExists) {\n return undefined\n }\n\n return {\n key,\n enabled: !!flagValue,\n variant: typeof flagValue === 'string' ? flagValue : undefined,\n payload: parsePayload(payload),\n }\n }\n\n /*\n * Fetches the payload for a remote config feature flag. This method will bypass any cached values and fetch the latest\n * value from the PostHog API.\n *\n * Note: Because the posthog-js SDK is primarily used with public project API keys, encrypted remote config payloads will\n * be redacted, never decrypted in the response.\n *\n * ### Usage:\n *\n * getRemoteConfigPayload(\"home-page-welcome-message\", (payload) => console.log(`Fetched remote config: ${payload}`))\n *\n * @param {String} key Key of the feature flag.\n * @param {Function} [callback] The callback function will be called once the remote config feature flag payload has been fetched.\n */\n getRemoteConfigPayload(key: string, callback: RemoteConfigFeatureFlagCallback): void {\n const token = this._config.token\n const data: Record<string, any> = {\n distinct_id: this._instance.get_distinct_id(),\n token,\n }\n\n // Add evaluation contexts if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_contexts = this._getValidEvaluationEnvironments()\n }\n\n const flagKeys = this._getValidFlagKeys()\n if (!isUndefined(flagKeys)) {\n data.flag_keys = flagKeys\n }\n\n this._instance._send_request({\n method: 'POST',\n url: this._instance.requestRouter.endpointFor('flags', '/flags/?v=2'),\n data,\n compression: this._config.disable_compression ? undefined : Compression.Base64,\n timestampMode: 'body',\n timeout: this._config.feature_flag_request_timeout_ms,\n callback: (response) => {\n const flagPayloads = response.json?.['featureFlagPayloads']\n callback(flagPayloads?.[key] || undefined)\n },\n })\n }\n\n /**\n * See if feature flag is enabled for user.\n *\n * By default, this method may return cached values from localStorage if the `/flags` endpoint\n * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n * (e.g., a flag that was disabled on the server).\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * // Only use fresh values from the server\n * if(posthog.isFeatureEnabled('beta-feature', { fresh: true })) { // do something }\n *\n * @param {String} key Key of the feature flag.\n * @param {Object} [options] Optional settings.\n * @param {boolean} [options.send_event=true] If false, won't send a $feature_flag_called event to PostHog.\n * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n * Use this when you need to ensure the flag value reflects the current server state.\n * Returns undefined until the /flags endpoint responds.\n * @param {boolean} [options.defaultValue] Value to return when the flag has no value, e.g. flags have not loaded yet or no flag with that key exists.\n * @returns {boolean | undefined} Whether the flag is enabled; when the flag has no value, defaultValue if given, otherwise undefined.\n */\n isFeatureEnabled(key: string, options: IsFeatureEnabledOptions & { defaultValue: boolean }): boolean\n isFeatureEnabled(key: string, options?: IsFeatureEnabledOptions): boolean | undefined\n isFeatureEnabled(key: string, options: IsFeatureEnabledOptions = {}): boolean | undefined {\n if (options.fresh && !this._flagsLoadedFromRemote) {\n return options.defaultValue\n }\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + FLAG_TIMEOUT_MSG)\n return options.defaultValue\n }\n const flagValue = this.getFeatureFlag(key, options)\n return isUndefined(flagValue) ? options.defaultValue : !!flagValue\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(\n response: Partial<FlagsResponse>,\n errorsLoading?: boolean,\n options?: { partialResponse?: boolean }\n ): void {\n if (!this._persistence) {\n return\n }\n this._hasLoadedFlags = true\n\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n const currentFlagDetails = this.getFlagsWithDetails()\n parseFlagsResponse(response, this._persistence, currentFlags, currentFlagPayloads, currentFlagDetails, options)\n\n // Reset stale refresh flag when we successfully receive fresh flags\n if (!errorsLoading) {\n this._staleCacheRefreshTriggered = false\n }\n\n this._fireFeatureFlagsCallbacks(errorsLoading)\n }\n\n /**\n * @deprecated Use overrideFeatureFlags instead. This will be removed in a future version.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>, suppressWarning: boolean = false): void {\n logger.warn('override is deprecated. Please use overrideFeatureFlags instead.')\n this.overrideFeatureFlags({\n flags: flags,\n suppressWarning: suppressWarning,\n })\n }\n\n /**\n * Override feature flags on the client-side. Useful for setting non-persistent feature flags,\n * or for testing/debugging feature flags in the PostHog app.\n *\n * ### Usage:\n *\n * - posthog.featureFlags.overrideFeatureFlags(false) // clear all overrides\n * - posthog.featureFlags.overrideFeatureFlags(['beta-feature']) // enable flags\n * - posthog.featureFlags.overrideFeatureFlags({'beta-feature': 'variant'}) // set variants\n * - posthog.featureFlags.overrideFeatureFlags({ flags: ['beta-feature'] }) // enable flags\n * - posthog.featureFlags.overrideFeatureFlags({ flags: {'beta-feature': 'variant'} }) // set variants\n * - posthog.featureFlags.overrideFeatureFlags({ // set both flags and payloads\n * flags: {'beta-feature': 'variant'},\n * payloads: { 'beta-feature': { someData: true } }\n * })\n * - posthog.featureFlags.overrideFeatureFlags({ // only override payloads\n * payloads: { 'beta-feature': { someData: true } }\n * })\n */\n overrideFeatureFlags(overrideOptions: OverrideFeatureFlagsOptions): void {\n if (!this._instance.__loaded || !this._persistence) {\n return logger.uninitializedWarning('posthog.featureFlags.overrideFeatureFlags')\n }\n\n // Clear all overrides if false, lets you do something like posthog.featureFlags.overrideFeatureFlags(false)\n if (overrideOptions === false) {\n this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n this._fireFeatureFlagsCallbacks()\n\n return forceDebugLogger.info('All overrides cleared')\n }\n\n // Array syntax: ['flag-a', 'flag-b'] -> { 'flag-a': true, 'flag-b': true }\n if (isArray(overrideOptions)) {\n const flagsObj = arrayToFlagsRecord(overrideOptions)\n this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n this._fireFeatureFlagsCallbacks()\n\n return forceDebugLogger.info('Flag overrides set', { flags: overrideOptions })\n }\n\n if (\n overrideOptions &&\n typeof overrideOptions === 'object' &&\n ('flags' in overrideOptions || 'payloads' in overrideOptions)\n ) {\n const options = overrideOptions\n this._override_warning = Boolean(options.suppressWarning ?? false)\n\n // Handle flags if provided, lets you do something like posthog.featureFlags.overrideFeatureFlags({flags: ['beta-feature']})\n if ('flags' in options) {\n if (options.flags === false) {\n this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n forceDebugLogger.info('Flag overrides cleared')\n } else if (options.flags) {\n if (isArray(options.flags)) {\n const flagsObj = arrayToFlagsRecord(options.flags)\n this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: options.flags })\n }\n\n forceDebugLogger.info('Flag overrides set', { flags: options.flags })\n }\n }\n\n // Handle payloads independently, lets you do something like posthog.featureFlags.overrideFeatureFlags({payloads: { 'beta-feature': { someData: true } }})\n if ('payloads' in options) {\n if (options.payloads === false) {\n this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n forceDebugLogger.info('Payload overrides cleared')\n } else if (options.payloads) {\n this._persistence.register({\n [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: options.payloads,\n })\n forceDebugLogger.info('Payload overrides set', { payloads: options.payloads })\n }\n }\n\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n // Fallback: treat as Record<string, string | boolean>, e.g. {'beta-feature': 'variant'}\n if (overrideOptions && typeof overrideOptions === 'object') {\n this._persistence.register({\n [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: overrideOptions as Record<string, string | boolean>,\n })\n this._fireFeatureFlagsCallbacks()\n\n return forceDebugLogger.info('Flag overrides set', { flags: overrideOptions })\n }\n\n logger.warn('Invalid overrideOptions provided to overrideFeatureFlags', { overrideOptions })\n }\n\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this._hasLoadedFlags) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n // Isolate the callback so a user-provided handler that throws surfaces as a logged\n // error rather than propagating out of onFeatureFlags as a posthog-js SDK error.\n try {\n callback(flags, flagVariants)\n } catch (error) {\n logger.error('Error while running feature flags callback', error)\n }\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n const existing_early_access_features: EarlyAccessFeature[] = this._prop(PERSISTENCE_EARLY_ACCESS_FEATURES) || []\n const feature = existing_early_access_features.find((f) => f.flagKey === key)\n\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n\n const properties: Properties = {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n }\n\n if (feature) {\n properties['$early_access_feature_name'] = feature.name\n }\n\n if (stage) {\n properties['$feature_enrollment_stage'] = stage\n }\n\n this._instance.capture('$feature_enrollment_update', properties)\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this._persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n const existing_early_access_features = this._prop(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n const stageParams = stages ? `&${stages.map((s) => `stage=${s}`).join('&')}` : ''\n\n if (!existing_early_access_features || force_reload) {\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this._config.token}${stageParams}`\n ),\n method: 'GET',\n timestampMode: 'query',\n callback: (response) => {\n if (!response.json) {\n return\n }\n const earlyAccessFeatures = (response.json as EarlyAccessFeatureResponse).earlyAccessFeatures\n // Unregister first to ensure complete replacement, not merge\n // This prevents accumulation of stale features in persistence\n this._persistence?.unregister(PERSISTENCE_EARLY_ACCESS_FEATURES)\n this._persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n },\n })\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(errorsLoading?: boolean): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => {\n // Isolate each handler: a user-provided onFeatureFlags callback that throws must not\n // break the callback chain (preventing later handlers from firing) or surface as a\n // posthog-js SDK error in error tracking.\n try {\n handler(flags, flagVariants, { errorsLoading })\n } catch (error) {\n logger.error('Error while running feature flags callback', error)\n }\n })\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n const existingProperties = this._prop(STORED_PERSON_PROPERTIES_KEY) || {}\n\n // If the caller passes { $set, $set_once }, split them apart so we can apply $set_once\n // semantics (skip keys that already exist). Otherwise treat all properties as $set for\n // backward compatibility with the public API.\n const propsToSet = properties?.['$set'] || (!properties?.['$set_once'] ? properties : {})\n const propsToSetOnce = properties?.['$set_once']\n\n const setOnceProps: Properties = {}\n if (propsToSetOnce) {\n for (const key in propsToSetOnce) {\n if (Object.prototype.hasOwnProperty.call(propsToSetOnce, key)) {\n if (!(key in existingProperties)) {\n setOnceProps[key] = propsToSetOnce[key]\n }\n }\n }\n }\n\n this._instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...setOnceProps,\n ...propsToSet,\n },\n })\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n /**\n * Remove override person properties used for feature flags.\n * This is the counterpart to setPersonPropertiesForFlags, used when person properties\n * are unset so flags re-evaluate without the removed values.\n */\n unsetPersonPropertiesForFlags(propertyNames: string[], reloadFeatureFlags = true): void {\n const existingProperties = this._prop(STORED_PERSON_PROPERTIES_KEY) || {}\n\n const nextProperties: Properties = { ...existingProperties }\n propertyNames.forEach((name) => {\n delete nextProperties[name]\n })\n\n this._instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: nextProperties,\n })\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(reloadFeatureFlags = true): void {\n this._instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this._prop(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this._instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this._instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this._prop(STORED_GROUP_PROPERTIES_KEY) || {}\n this._instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this._instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n\n reset(): void {\n this._hasLoadedFlags = false\n this._requestInFlight = false\n this._reloadingDisabled = false\n this._additionalReloadRequested = false\n this._flagsLoadedFromRemote = false\n this.$anon_distinct_id = undefined\n this._clearDebouncer()\n this._override_warning = false\n this._consecutiveStatusZeroFailures = 0\n }\n}\n","import { ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS, ERROR_TRACKING_SUPPRESSION_RULES } from './constants'\nimport { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport { CaptureResult, ErrorTrackingSuppressionRule, Properties, RemoteConfigResult } from './types'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { propertyComparisons } from '@posthog/browser-common/utils/property-utils'\nimport { isString, isArray, isObject, ErrorTracking, isNullish } from '@posthog/core'\n\nconst logger = createLogger('[Error tracking]')\n\nexport function buildErrorPropertiesBuilder() {\n return new ErrorTracking.ErrorPropertiesBuilder(\n [\n new ErrorTracking.DOMExceptionCoercer(),\n new ErrorTracking.PromiseRejectionEventCoercer(),\n new ErrorTracking.ErrorEventCoercer(),\n new ErrorTracking.ErrorCoercer(),\n new ErrorTracking.EventCoercer(),\n new ErrorTracking.ObjectCoercer(),\n new ErrorTracking.StringCoercer(),\n new ErrorTracking.PrimitiveCoercer(),\n ],\n ErrorTracking.createDefaultStackParser()\n )\n}\nexport class PostHogExceptions implements Extension {\n private readonly _instance: PostHog\n private _suppressionRules: ErrorTrackingSuppressionRule[] = []\n private _errorPropertiesBuilder: ErrorTracking.ErrorPropertiesBuilder = buildErrorPropertiesBuilder()\n private _exceptionStepsBuffer: ErrorTracking.ExceptionStepsBuffer\n private _exceptionStepsConfig: ErrorTracking.ResolvedExceptionStepsConfig\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._suppressionRules = this._instance.persistence?.get_property(ERROR_TRACKING_SUPPRESSION_RULES) ?? []\n this._exceptionStepsConfig = ErrorTracking.resolveExceptionStepsConfig(this._getExceptionStepsConfig())\n this._exceptionStepsBuffer = new ErrorTracking.ExceptionStepsBuffer(this._exceptionStepsConfig)\n }\n\n onConfigChange() {\n this._exceptionStepsConfig = ErrorTracking.resolveExceptionStepsConfig(this._getExceptionStepsConfig())\n this._exceptionStepsBuffer.setConfig(this._exceptionStepsConfig)\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without an errorTracking key.\n return\n }\n\n const response = result.config\n if (!('errorTracking' in response)) {\n return\n }\n\n const suppressionRules = response.errorTracking?.suppressionRules ?? []\n const captureExtensionExceptions = response.errorTracking?.captureExtensionExceptions\n\n // store this in-memory in case persistence is disabled\n this._suppressionRules = suppressionRules\n\n if (this._instance.persistence) {\n this._instance.persistence.register({\n [ERROR_TRACKING_SUPPRESSION_RULES]: this._suppressionRules,\n [ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS]: captureExtensionExceptions,\n })\n }\n }\n\n private get _captureExtensionExceptions() {\n const enabled_server_side = !!this._instance.get_property(ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS)\n const enabled_client_side = this._instance.config.error_tracking.captureExtensionExceptions\n return enabled_client_side ?? enabled_server_side ?? false\n }\n\n buildProperties(\n input: unknown,\n metadata?: { handled?: boolean; syntheticException?: Error }\n ): ErrorTracking.ErrorProperties {\n return this._errorPropertiesBuilder.buildFromUnknown(input, {\n syntheticException: metadata?.syntheticException,\n mechanism: {\n handled: metadata?.handled,\n },\n })\n }\n\n addExceptionStep(message: string, properties?: Properties): void {\n if (!this._exceptionStepsConfig.enabled) {\n return\n }\n\n try {\n if (!isString(message) || message.trim().length === 0) {\n logger.warn('Ignoring exception step because message must be a non-empty string')\n return\n }\n\n const userProperties = this._coerceExceptionStepProperties(properties)\n\n const { sanitizedProperties, droppedKeys } = ErrorTracking.stripReservedExceptionStepFields(userProperties)\n\n if (droppedKeys.length > 0) {\n logger.warn('Ignoring reserved exception step fields', { droppedKeys })\n }\n\n this._exceptionStepsBuffer.add({\n [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE]: message,\n [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP]: new Date().toISOString(),\n ...sanitizedProperties,\n })\n } catch (error) {\n logger.error('Failed to add exception step. Ignoring breadcrumb.', error)\n }\n }\n\n sendExceptionEvent(properties: Properties): CaptureResult | undefined {\n try {\n const exceptionList = properties.$exception_list\n\n if (this._isExceptionList(exceptionList)) {\n if (this._matchesSuppressionRule(exceptionList)) {\n this._addDroppedExceptionStep('Exception dropped: matched a suppression rule')\n logger.info('Skipping exception capture because a suppression rule matched')\n return\n }\n\n if (!this._captureExtensionExceptions && this._isExtensionException(exceptionList)) {\n this._addDroppedExceptionStep('Exception dropped: thrown by a browser extension')\n logger.info('Skipping exception capture because it was thrown by an extension')\n return\n }\n\n if (\n !this._instance.config.error_tracking.__capturePostHogExceptions &&\n this._isPostHogException(exceptionList)\n ) {\n this._addDroppedExceptionStep('Exception dropped: thrown by the PostHog SDK')\n logger.info('Skipping exception capture because it was thrown by the PostHog SDK')\n return\n }\n }\n\n const propertiesForExceptionCapture =\n this._exceptionStepsConfig.enabled && isNullish(properties.$exception_steps)\n ? this._addBufferedExceptionSteps(properties)\n : properties\n\n try {\n const result = this._instance.capture('$exception', propertiesForExceptionCapture, {\n _noTruncate: true,\n _batchKey: 'exceptionEvent',\n _originatedFromCaptureException: true,\n })\n\n if (result) {\n this._exceptionStepsBuffer.clear()\n }\n\n return result\n } catch (error) {\n logger.error('Failed to capture exception event. Dropping this exception.', error)\n this._exceptionStepsBuffer.clear()\n return\n }\n } catch (error) {\n logger.error('Failed to process exception event. Ignoring this exception.', error)\n return\n }\n }\n\n private _addBufferedExceptionSteps(properties: Properties): Properties {\n try {\n const exceptionSteps = this._exceptionStepsBuffer.getAttachable()\n\n if (exceptionSteps.length === 0) {\n return properties\n }\n\n return {\n ...properties,\n $exception_steps: exceptionSteps,\n }\n } catch (error) {\n logger.error('Failed to read buffered exception steps. Capturing exception without steps.', error)\n return properties\n }\n }\n\n private _addDroppedExceptionStep(message: string): void {\n if (this._exceptionStepsConfig.enabled) {\n this._exceptionStepsBuffer.add({\n [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE]: message,\n [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP]: new Date().toISOString(),\n })\n }\n }\n\n private _coerceExceptionStepProperties(properties?: Properties): Record<string, unknown> {\n if (!isObject(properties)) {\n return {}\n }\n\n return { ...(properties as Record<string, unknown>) }\n }\n\n private _getExceptionStepsConfig(): ErrorTracking.ExceptionStepsConfig {\n return this._instance.config.error_tracking?.exception_steps ?? {}\n }\n\n private _matchesSuppressionRule(exceptionList: ErrorTracking.ExceptionList): boolean {\n if (exceptionList.length === 0) {\n return false\n }\n\n const exceptionValues = exceptionList.reduce(\n (acc, { type, value }) => {\n if (isString(type) && type.length > 0) {\n acc['$exception_types'].push(type)\n }\n if (isString(value) && value.length > 0) {\n acc['$exception_values'].push(value)\n }\n return acc\n },\n {\n $exception_types: [] as string[],\n $exception_values: [] as string[],\n }\n )\n\n return this._suppressionRules.some((rule) => {\n const results = rule.values.map((v) => {\n const compare = propertyComparisons[v.operator]\n const targets = isArray(v.value) ? v.value : [v.value]\n const values = exceptionValues[v.key] ?? []\n return targets.length > 0 ? compare(targets, values) : false\n })\n return rule.type === 'OR' ? results.some(Boolean) : results.every(Boolean)\n })\n }\n\n private _isExtensionException(exceptionList: ErrorTracking.ExceptionList): boolean {\n const frames = exceptionList.flatMap((e) => e.stacktrace?.frames ?? [])\n return frames.some((f) => f.filename && f.filename.startsWith('chrome-extension://'))\n }\n\n private _isPostHogException(exceptionList: ErrorTracking.ExceptionList): boolean {\n if (exceptionList.length > 0) {\n const exception = exceptionList[0]\n const frames = exception.stacktrace?.frames ?? []\n const lastFrame = frames[frames.length - 1]\n return lastFrame?.filename?.includes('posthog.com/static') ?? false\n }\n\n return false\n }\n\n private _isExceptionList(candidate: unknown): candidate is ErrorTracking.ExceptionList {\n return !isNullish(candidate) && isArray(candidate)\n }\n}\n","import { PostHog } from './posthog-core'\nimport { navigator, window } from '@posthog/browser-common/utils/globals'\nimport {\n WebExperiment,\n WebExperimentsCallback,\n WebExperimentTransform,\n WebExperimentUrlMatchType,\n WebExperimentVariant,\n} from './web-experiments-types'\nimport { WEB_EXPERIMENTS } from './constants'\nimport { isNullish, isString } from '@posthog/core'\nimport { getQueryParam } from '@posthog/browser-common/utils/request-utils'\nimport { isMatchingRegex } from '@posthog/browser-common/utils/regex-utils'\nimport { applyUrlTargetingOverride } from '@posthog/browser-common/utils/url-targeting-utils'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { isLikelyBot } from '@posthog/browser-common/utils/blocked-uas'\nimport { getCampaignParams } from '@posthog/browser-common/utils/event-utils'\nimport { Extension } from './extensions/types'\n\nconst BOT_REFUSE_MSG = 'Refusing to render web experiment since the viewer is a likely bot'\n\nexport const webExperimentUrlValidationMap: Record<\n WebExperimentUrlMatchType,\n (conditionsUrl: string, href: string) => boolean\n> = {\n icontains: (conditionsUrl, href) => href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n not_icontains: (conditionsUrl, href) => href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) === -1,\n regex: (conditionsUrl, href) => isMatchingRegex(href, conditionsUrl),\n not_regex: (conditionsUrl, href) => !isMatchingRegex(href, conditionsUrl),\n exact: (conditionsUrl, href) => href === conditionsUrl,\n is_not: (conditionsUrl, href) => href !== conditionsUrl,\n}\n\nexport class WebExperiments implements Extension {\n private _flagToExperiments?: Map<string, WebExperiment>\n\n private get _config() {\n return this._instance.config\n }\n\n constructor(private _instance: PostHog) {\n this._instance.onFeatureFlags((flags: string[]) => {\n this.onFeatureFlags(flags)\n })\n }\n\n // No-op: activation is driven by the onFeatureFlags callback registered in the constructor\n initialize() {}\n\n onFeatureFlags(flags: string[]) {\n if (this._is_bot()) {\n WebExperiments._logInfo(BOT_REFUSE_MSG)\n return\n }\n\n if (this._config.disable_web_experiments) {\n return\n }\n\n if (isNullish(this._flagToExperiments)) {\n // Indicates first load so we trigger the loaders\n this._flagToExperiments = new Map<string, WebExperiment>()\n this.loadIfEnabled()\n this.previewWebExperiment()\n return\n }\n\n WebExperiments._logInfo('applying feature flags', flags)\n flags.forEach((flag) => {\n if (this._flagToExperiments && this._flagToExperiments?.has(flag)) {\n const selectedVariant = this._instance.getFeatureFlag(flag) as unknown as string\n const webExperiment = this._flagToExperiments?.get(flag)\n if (selectedVariant && webExperiment?.variants[selectedVariant]) {\n this._applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n }\n })\n }\n\n previewWebExperiment() {\n const location = WebExperiments.getWindowLocation()\n if (location?.search) {\n const experimentID = getQueryParam(location?.search, '__experiment_id')\n const variant = getQueryParam(location?.search, '__experiment_variant')\n if (experimentID && variant) {\n WebExperiments._logInfo(`previewing web experiments ${experimentID} && ${variant}`)\n this.getWebExperiments(\n (webExperiments) => {\n this._showPreviewWebExperiment(parseInt(experimentID), variant, webExperiments)\n },\n false,\n true\n )\n }\n }\n }\n\n loadIfEnabled() {\n if (this._config.disable_web_experiments) {\n return\n }\n\n this.getWebExperimentsAndEvaluateDisplayLogic()\n }\n\n public getWebExperimentsAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getWebExperiments((webExperiments) => {\n WebExperiments._logInfo(`retrieved web experiments from the server`)\n this._flagToExperiments = new Map<string, WebExperiment>()\n\n webExperiments.forEach((webExperiment) => {\n if (webExperiment.feature_flag_key) {\n if (this._flagToExperiments) {\n WebExperiments._logInfo(\n `setting flag key `,\n webExperiment.feature_flag_key,\n ` to web experiment `,\n webExperiment\n )\n this._flagToExperiments?.set(webExperiment.feature_flag_key, webExperiment)\n }\n\n const selectedVariant = this._instance.getFeatureFlag(webExperiment.feature_flag_key)\n if (isString(selectedVariant) && webExperiment.variants[selectedVariant]) {\n this._applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n } else if (webExperiment.variants) {\n for (const variant in webExperiment.variants) {\n const testVariant = webExperiment.variants[variant]\n const matchTest = WebExperiments._matchesTestVariant(testVariant, this._instance)\n if (matchTest) {\n this._applyTransforms(webExperiment.name, variant, testVariant.transforms)\n }\n }\n }\n })\n }, forceReload)\n }\n\n public getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean, previewing?: boolean) {\n if (this._config.disable_web_experiments && !previewing) {\n return callback([])\n }\n\n const existingWebExperiments = this._instance.get_property(WEB_EXPERIMENTS)\n if (existingWebExperiments && !forceReload) {\n return callback(existingWebExperiments)\n }\n\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor('api', `/api/web_experiments/?token=${this._config.token}`),\n method: 'GET',\n timestampMode: 'query',\n callback: (response) => {\n if (response.statusCode !== 200 || !response.json) {\n return callback([])\n }\n const webExperiments = response.json.experiments || []\n return callback(webExperiments)\n },\n })\n }\n\n private _showPreviewWebExperiment(experimentID: number, variant: string, webExperiments: WebExperiment[]) {\n const previewExperiments = webExperiments.filter((exp) => exp.id === experimentID)\n if (previewExperiments && previewExperiments.length > 0) {\n WebExperiments._logInfo(\n `Previewing web experiment [${previewExperiments[0].name}] with variant [${variant}]`\n )\n this._applyTransforms(\n previewExperiments[0].name,\n variant,\n previewExperiments[0].variants[variant].transforms\n )\n }\n }\n private static _matchesTestVariant(testVariant: WebExperimentVariant, instance: PostHog) {\n if (isNullish(testVariant.conditions)) {\n return false\n }\n return (\n WebExperiments._matchUrlConditions(testVariant, instance) && WebExperiments._matchUTMConditions(testVariant)\n )\n }\n\n private static _matchUrlConditions(testVariant: WebExperimentVariant, instance: PostHog): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.url)) {\n return true\n }\n\n const location = WebExperiments.getWindowLocation()\n if (location) {\n // honors the `get_current_url` config hook so apps that rewrite their URL can target experiments correctly\n const href = applyUrlTargetingOverride(instance, location.href)\n const urlCheck = testVariant.conditions?.url\n ? webExperimentUrlValidationMap[testVariant.conditions?.urlMatchType ?? 'icontains'](\n testVariant.conditions.url,\n href\n )\n : true\n return urlCheck\n }\n\n return false\n }\n\n public static getWindowLocation(): Location | undefined {\n return window?.location\n }\n\n private static _matchUTMConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.utm)) {\n return true\n }\n const campaignParams = getCampaignParams()\n if (campaignParams['utm_source']) {\n const utmCampaignMatched = testVariant.conditions?.utm?.utm_campaign\n ? testVariant.conditions?.utm?.utm_campaign == campaignParams['utm_campaign']\n : true\n\n const utmSourceMatched = testVariant.conditions?.utm?.utm_source\n ? testVariant.conditions?.utm?.utm_source == campaignParams['utm_source']\n : true\n\n const utmMediumMatched = testVariant.conditions?.utm?.utm_medium\n ? testVariant.conditions?.utm?.utm_medium == campaignParams['utm_medium']\n : true\n\n const utmTermMatched = testVariant.conditions?.utm?.utm_term\n ? testVariant.conditions?.utm?.utm_term == campaignParams['utm_term']\n : true\n\n return utmCampaignMatched && utmMediumMatched && utmTermMatched && utmSourceMatched\n }\n\n return false\n }\n\n private static _logInfo(msg: string, ...args: any[]) {\n logger.info(`[WebExperiments] ${msg}`, args)\n }\n\n private _applyTransforms(experiment: string, variant: string, transforms: WebExperimentTransform[]) {\n if (this._is_bot()) {\n WebExperiments._logInfo(BOT_REFUSE_MSG)\n return\n }\n\n if (variant === 'control') {\n WebExperiments._logInfo('Control variants leave the page unmodified.')\n return\n }\n\n transforms.forEach((transform) => {\n if (transform.selector) {\n WebExperiments._logInfo(\n `applying transform of variant ${variant} for experiment ${experiment} `,\n transform\n )\n\n // eslint-disable-next-line no-restricted-globals\n const elements = document?.querySelectorAll(transform.selector)\n elements?.forEach((element) => {\n const htmlElement = element as HTMLElement\n if (transform.html) {\n htmlElement.innerHTML = transform.html\n }\n\n if (transform.css) {\n htmlElement.setAttribute('style', transform.css)\n }\n })\n }\n })\n }\n\n _is_bot(): boolean | undefined {\n if (navigator && this._instance) {\n return isLikelyBot(navigator, this._config.custom_blocked_useragents)\n } else {\n return undefined\n }\n }\n}\n","import { LOAD_EXT_NOT_FOUND } from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n RestoreFromTokenResponse,\n RequestRestoreLinkResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../../posthog-conversations-types'\nimport { RemoteConfigResult } from '../../types'\nimport { assignableWindow, LazyLoadedConversationsInterface } from '../../utils/globals'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { isNullish, isUndefined, isBoolean, isNull } from '@posthog/core'\nimport { isToolbarInstance } from '@posthog/browser-common/utils/general-utils'\nimport { Extension } from '../types'\n\nconst logger = createLogger('[Conversations]')\nconst NOT_AVAILABLE = 'Conversations not available yet.'\n\nexport type ConversationsManager = LazyLoadedConversationsInterface\n\nexport class PostHogConversations implements Extension {\n // This is set to undefined until the remote config is loaded\n // then it's set to true if conversations are enabled\n // or false if conversations are disabled in the project settings\n private _isConversationsEnabled?: boolean = undefined\n private _conversationsManager: LazyLoadedConversationsInterface | null = null\n private _isInitializing: boolean = false\n private _remoteConfig: ConversationsRemoteConfig | null = null\n\n constructor(private _instance: PostHog) {}\n\n initialize() {\n this.loadIfEnabled()\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n // Don't load conversations if disabled via config\n if (this._instance.config.disable_conversations) {\n return\n }\n\n if (!result.ok) {\n // Failure behaves like a response without a conversations key.\n return\n }\n\n const conversations = result.config['conversations']\n if (isNullish(conversations)) {\n return\n }\n\n // Handle both boolean and object response\n if (isBoolean(conversations)) {\n this._isConversationsEnabled = conversations\n } else {\n // It's a ConversationsRemoteConfig object\n this._isConversationsEnabled = conversations.enabled\n this._remoteConfig = conversations\n }\n\n this.loadIfEnabled()\n }\n\n reset(): void {\n // Delegate cleanup to the lazy-loaded manager (which knows about persistence keys)\n // If not loaded, there's nothing to reset anyway\n this._conversationsManager?.reset()\n this._conversationsManager = null\n\n // Reset local state\n this._isConversationsEnabled = undefined\n this._remoteConfig = null\n }\n\n loadIfEnabled() {\n if (this._conversationsManager) {\n return\n }\n if (this._isInitializing) {\n return\n }\n if (this._instance.config.disable_conversations) {\n return\n }\n // The toolbar's internal PostHog instance must not own the conversations\n // manager — its distinct_id is always anonymous and would be sent instead\n // of the identified user's ID.\n if (isToolbarInstance(this._instance.config)) {\n return\n }\n if (this._instance.config.cookieless_mode && this._instance.consent.isOptedOut()) {\n return\n }\n\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n return\n }\n\n // Wait for remote config to load\n if (isUndefined(this._isConversationsEnabled)) {\n return\n }\n\n // Check if conversations are enabled\n if (!this._isConversationsEnabled) {\n return\n }\n\n // Check if we have the required config\n if (!this._remoteConfig || !this._remoteConfig.token) {\n logger.error('Conversations enabled but missing token in remote config.')\n return\n }\n\n // Note: Domain check is done in ConversationsManager for widget rendering\n // The conversations API is loaded regardless of domain restrictions\n\n this._isInitializing = true\n\n try {\n const initConversations = phExtensions.initConversations\n if (initConversations) {\n // Conversations code is already loaded\n this._completeInitialization(initConversations)\n this._isInitializing = false\n return\n }\n\n // If we reach here, conversations code is not loaded yet\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n this._handleLoadError(LOAD_EXT_NOT_FOUND)\n return\n }\n\n // Load the conversations bundle\n loadExternalDependency(this._instance, 'conversations', (err) => {\n if (err || !phExtensions.initConversations) {\n this._handleLoadError('Could not load conversations script', err)\n } else {\n this._completeInitialization(phExtensions.initConversations)\n }\n this._isInitializing = false\n })\n } catch (e) {\n this._handleLoadError('Error initializing conversations', e)\n this._isInitializing = false\n }\n }\n\n /** Helper to finalize conversations initialization */\n private _completeInitialization(\n initConversationsFn: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n ): void {\n if (!this._remoteConfig) {\n logger.error('Cannot complete initialization: remote config is null')\n return\n }\n\n try {\n // Pass config and PostHog instance to the extension\n this._conversationsManager = initConversationsFn(this._remoteConfig, this._instance)\n logger.info('Conversations loaded successfully')\n } catch (e) {\n this._handleLoadError('Error completing conversations initialization', e)\n }\n }\n\n /** Helper to handle initialization errors */\n private _handleLoadError(message: string, error?: any): void {\n logger.error(message, error)\n this._conversationsManager = null\n this._isInitializing = false\n }\n\n /**\n * Show the conversations widget (button and chat panel)\n */\n show(): void {\n if (!this._conversationsManager) {\n logger.warn('Conversations not loaded yet.')\n return\n }\n this._conversationsManager.show()\n }\n\n /**\n * Hide the conversations widget completely (button and chat panel)\n */\n hide(): void {\n if (!this._conversationsManager) {\n return\n }\n this._conversationsManager.hide()\n }\n\n /**\n * Check if conversations are available (enabled in remote config AND loaded)\n * Use this to check if conversations API can be used.\n */\n isAvailable(): boolean {\n return this._isConversationsEnabled === true && !isNull(this._conversationsManager)\n }\n\n /**\n * Check if the widget is currently visible (rendered and shown)\n */\n isVisible(): boolean {\n return this._conversationsManager?.isVisible() ?? false\n }\n\n /**\n * Send a message programmatically\n * Creates a new ticket if none exists or if newTicket is true\n *\n * @param message - The message text to send\n * @param userTraits - Optional user identification data (name, email)\n * @param newTicket - If true, forces creation of a new ticket (starts new conversation)\n * @returns Promise with response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * // Send to existing or create new conversation\n * const response = await posthog.conversations.sendMessage('Hello!', {\n * name: 'John Doe',\n * email: 'john@example.com'\n * })\n *\n * @example\n * // Force creation of a new conversation/ticket\n * const newConvo = await posthog.conversations.sendMessage('Start fresh', undefined, true)\n */\n async sendMessage(\n message: string,\n userTraits?: UserProvidedTraits,\n newTicket?: boolean\n ): Promise<SendMessageResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.sendMessage(message, userTraits, newTicket)\n }\n\n /**\n * Get messages for the current or specified ticket\n *\n * @param ticketId - Optional ticket ID (defaults to current active ticket)\n * @param after - Optional ISO timestamp to fetch messages after\n * @returns Promise with messages response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * // Get messages for current ticket\n * const messages = await posthog.conversations.getMessages()\n *\n * // Get messages for specific ticket\n * const messages = await posthog.conversations.getMessages('ticket-uuid')\n */\n async getMessages(ticketId?: string, after?: string): Promise<GetMessagesResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.getMessages(ticketId, after)\n }\n\n /**\n * Mark messages as read for the current or specified ticket\n *\n * @param ticketId - Optional ticket ID (defaults to current active ticket)\n * @returns Promise with response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * await posthog.conversations.markAsRead()\n */\n async markAsRead(ticketId?: string): Promise<MarkAsReadResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.markAsRead(ticketId)\n }\n\n /**\n * Get list of tickets for the current widget session\n *\n * @param options - Optional filtering and pagination options\n * @returns Promise with tickets response or null if conversations not available yet\n * @note Conversations must be available first (check with isAvailable())\n *\n * @example\n * const tickets = await posthog.conversations.getTickets({\n * limit: 10,\n * offset: 0,\n * status: 'open'\n * })\n */\n async getTickets(options?: GetTicketsOptions): Promise<GetTicketsResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.getTickets(options)\n }\n\n /**\n * Request a restore link email for previous conversations.\n *\n * @param email - Email address associated with previous conversations\n * @returns Promise with generic success response or null if conversations unavailable\n */\n async requestRestoreLink(email: string): Promise<RequestRestoreLinkResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.requestRestoreLink(email)\n }\n\n /**\n * Redeem a restore token and relink eligible tickets to this browser session.\n *\n * @param restoreToken - Opaque restore token from restore email link\n * @returns Promise with restore status or null if conversations unavailable\n */\n async restoreFromToken(restoreToken: string): Promise<RestoreFromTokenResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.restoreFromToken(restoreToken)\n }\n\n /**\n * Parse and redeem `ph_conv_restore` token from the current URL.\n *\n * @returns Promise with restore status, or null when no token/conversations unavailable\n */\n async restoreFromUrlToken(): Promise<RestoreFromTokenResponse | null> {\n if (!this._conversationsManager) {\n logger.warn(NOT_AVAILABLE)\n return null\n }\n return this._conversationsManager.restoreFromUrlToken()\n }\n\n /**\n * Get the current active ticket ID\n * Returns null if no conversation has been started yet or if not available\n *\n * @returns Ticket ID or null\n * @note Safe to call before conversations are available, will return null\n *\n * @example\n * const ticketId = posthog.conversations.getCurrentTicketId()\n * if (ticketId) {\n * console.log('Current ticket ID:', ticketId)\n * }\n */\n getCurrentTicketId(): string | null {\n return this._conversationsManager?.getCurrentTicketId() ?? null\n }\n\n /**\n * Get the widget session ID (persistent browser identifier)\n * This ID is used for access control and stays the same across page loads\n * Returns null if conversations not available yet\n *\n * @returns Session ID or null if not available\n * @note Safe to call before conversations are available, will return null\n *\n * @example\n * const sessionId = posthog.conversations.getWidgetSessionId()\n * if (!sessionId) {\n * // Conversations not available yet\n * posthog.conversations.show()\n * }\n */\n getWidgetSessionId(): string | null {\n return this._conversationsManager?.getWidgetSessionId() ?? null\n }\n\n /** @internal Called by PostHog.setIdentity() -- forwards to the manager without recursing */\n _onIdentityChanged(): void {\n this._conversationsManager?.setIdentity()\n }\n\n /** @internal Called by PostHog.clearIdentity() -- forwards to the manager without recursing */\n _onIdentityCleared(): void {\n this._conversationsManager?.clearIdentity()\n }\n}\n","import { LOAD_EXT_NOT_FOUND } from './constants'\nimport Config from './config'\nimport { PostHog } from './posthog-core'\nimport type { CaptureLogOptions, RemoteConfigResult, Logger, LogSdkContext, OtlpLogsPayload } from './types'\nimport {\n PostHogLogs as CorePostHogLogs,\n buildOtlpLogsPayload,\n buildResourceAttributes,\n isNullish,\n PostHogPersistedProperty,\n stripUrlHash,\n} from '@posthog/core'\nimport type { BufferedLogEntry, ResolvedPostHogLogsConfig, SendLogsBatchOutcome } from '@posthog/core'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport { assignableWindow } from './utils/globals'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { Extension } from './extensions/types'\nimport { resolveLogsConfig } from './logs-defaults'\nimport {\n isStatusZeroFailureCircuitBreakerTripped,\n updateStatusZeroFailureCount,\n} from '@posthog/browser-common/utils/request-utils'\n\nconst LOGS_ENDPOINT = '/i/v1/logs'\n// OTLP instrumentation-scope name for console auto-capture, distinguishing it from\n// programmatic logs (which use the SDK scope) in scope-based dashboards/queries.\nconst CONSOLE_SCOPE_NAME = 'console'\n// Safety backstop for a `_send_request` that never calls back. Set above the\n// request layer's own 60s timeout so a real (slow-but-completing) request always\n// settles via its callback first; this only fires on a genuinely callback-less\n// send (e.g. request enqueued before load, or a transport that never reports).\nconst LOGS_SEND_TIMEOUT_MS = 90000\n// Mirrors the event retry queue's status-0 budget (see retry-queue.ts\n// `STATUS_CODE_ZERO_MAX_RETRIES`): a request that dies before any HTTP response\n// while the browser reports itself online is almost always deterministically\n// blocked (ad blocker, CORS, extension), so retrying forever only burns network.\n// After this many consecutive such failures we stop sending and drop batches;\n// the `online` event reopens the pipe.\n// NOTE: keep the constant value and the warning copy in sync with retry-queue.ts.\nconst MAX_CONSECUTIVE_STATUS_ZERO_FAILURES = 3\n\nexport class PostHogLogs implements Extension {\n private _isLogsEnabled: boolean = false\n private _isLoaded: boolean = false\n private readonly _logger = createLogger('[logs]')\n\n // In-memory only; records do not survive a page reload.\n private _queue: BufferedLogEntry[] = []\n private _core: CorePostHogLogs | undefined\n private _resolvedConfig: ResolvedPostHogLogsConfig | undefined\n // The `logs` config the current `_core` was built from; a change rebuilds it.\n private _resolvedFrom: PostHog['config']['logs']\n private _capture_logger: Logger | undefined\n\n // Console auto-capture uses a dedicated core + queue (its `service.name`\n // defaults to `posthog-browser-logs`). Built lazily, only when console runs.\n private _consoleQueue: BufferedLogEntry[] = []\n private _consoleCore: CorePostHogLogs | undefined\n private _consoleResolvedConfig: ResolvedPostHogLogsConfig | undefined\n private _consoleResolvedFrom: PostHog['config']['logs']\n\n // Shared across both cores: they send to the same endpoint, so one blocker\n // verdict covers both.\n private _consecutiveStatusZeroFailures = 0\n\n constructor(private readonly _instance: PostHog) {\n if (this._instance && this._instance.config.logs?.captureConsoleLogs) {\n this._isLogsEnabled = true\n }\n // Flush on reconnect rather than waiting out the retry backoff.\n if (window) {\n addEventListener(window, 'online', this._onReconnect)\n }\n }\n\n private _onReconnect = (): void => {\n this._consecutiveStatusZeroFailures = 0\n this._core?.onReconnect()\n this._consoleCore?.onReconnect()\n }\n\n // Cores are built lazily (the extension exists before `init` applies config)\n // and rebuilt when `config.logs` is swapped. Callers reset the old core first\n // so its timer can't double-flush the shared queue; a flush already in flight\n // may still re-send its head batch on a mid-swap — a duplicate, never a loss.\n private _buildCore(\n getQueue: () => BufferedLogEntry[],\n setQueue: (q: BufferedLogEntry[]) => void,\n opts?: Parameters<typeof resolveLogsConfig>[1],\n scopeName?: string\n ): [CorePostHogLogs, ResolvedPostHogLogsConfig] {\n const config = resolveLogsConfig(this._instance?.config?.logs, opts)\n const core = new CorePostHogLogs(\n this._createHost(getQueue, setQueue),\n config,\n this._logger,\n () => this._getSdkContext(),\n (fn) => fn(),\n undefined,\n scopeName\n )\n return [core, config]\n }\n\n private _getCore(): CorePostHogLogs {\n const logsConfig = this._instance?.config?.logs\n if (!this._core || this._resolvedFrom !== logsConfig) {\n this._core?.reset()\n this._resolvedFrom = logsConfig\n ;[this._core, this._resolvedConfig] = this._buildCore(\n () => this._queue,\n (q) => {\n this._queue = q\n }\n )\n }\n return this._core\n }\n\n // Like `_getCore`, but with the console service name + scope, backed by `_consoleQueue`.\n private _getConsoleCore(): CorePostHogLogs {\n const logsConfig = this._instance?.config?.logs\n if (!this._consoleCore || this._consoleResolvedFrom !== logsConfig) {\n this._consoleCore?.reset()\n this._consoleResolvedFrom = logsConfig\n ;[this._consoleCore, this._consoleResolvedConfig] = this._buildCore(\n () => this._consoleQueue,\n (q) => {\n this._consoleQueue = q\n },\n { serviceNameDefault: 'posthog-browser-logs', consoleCapture: true },\n CONSOLE_SCOPE_NAME\n )\n }\n return this._consoleCore\n }\n\n initialize() {\n this.loadIfEnabled()\n }\n\n onRemoteConfig(result: RemoteConfigResult) {\n if (!result.ok) {\n // Failure behaves like a response without a logs key.\n return\n }\n\n const logCapture = result.config.logs?.captureConsoleLogs\n if (isNullish(logCapture) || !logCapture) {\n return\n }\n this._isLogsEnabled = true\n this.loadIfEnabled()\n }\n\n reset(): void {\n this._queue = []\n this._core?.reset()\n this._consoleQueue = []\n this._consoleCore?.reset()\n this._consecutiveStatusZeroFailures = 0\n }\n\n captureLog(options: CaptureLogOptions): void {\n this._getCore().captureLog(options)\n }\n\n // Console auto-capture (the lazy `logs` chunk) routes here so its records run\n // through the shared core pipeline and carry `service.name: posthog-browser-logs`.\n /** @internal */\n _captureConsoleLog(options: CaptureLogOptions): void {\n this._getConsoleCore().captureLog(options)\n }\n\n get logger(): Logger {\n if (!this._capture_logger) {\n this._capture_logger = {\n trace: (body, attributes) => this.captureLog({ body, level: 'trace', attributes }),\n debug: (body, attributes) => this.captureLog({ body, level: 'debug', attributes }),\n info: (body, attributes) => this.captureLog({ body, level: 'info', attributes }),\n warn: (body, attributes) => this.captureLog({ body, level: 'warn', attributes }),\n error: (body, attributes) => this.captureLog({ body, level: 'error', attributes }),\n fatal: (body, attributes) => this.captureLog({ body, level: 'fatal', attributes }),\n }\n }\n return this._capture_logger\n }\n\n // An explicit transport drains the whole queue in one request over that transport\n // (core's batched flush can't force a transport, and the unload sendBeacon must be\n // synchronous). No transport → core's batched, 413-aware, retrying flush.\n flushLogs(transport?: 'XHR' | 'fetch' | 'sendBeacon'): void {\n if (transport) {\n this._flushViaTransport(transport)\n return\n }\n if (this._core) {\n void this._core.flush().catch((err) => this._logger.error('PostHog logs flush failed:', err))\n }\n if (this._consoleCore) {\n void this._consoleCore.flush().catch((err) => this._logger.error('PostHog logs flush failed:', err))\n }\n }\n\n loadIfEnabled() {\n if (!this._isLogsEnabled || this._isLoaded) {\n return\n }\n\n const phExtensions = assignableWindow?.__PosthogExtensions__\n if (!phExtensions) {\n this._logger.error('PostHog Extensions not found.')\n return\n }\n\n const loadExternalDependency = phExtensions.loadExternalDependency\n if (!loadExternalDependency) {\n this._logger.error(LOAD_EXT_NOT_FOUND)\n return\n }\n\n loadExternalDependency(this._instance, 'logs', (err) => {\n if (err || !phExtensions.logs?.initializeLogs) {\n this._logger.error('Could not load logs script', err)\n } else {\n phExtensions.logs.initializeLogs(this._instance)\n this._isLoaded = true\n }\n })\n }\n\n // Host adapter for core's `PostHogLogs`; structurally checked against `LogsHost`\n // at the `new CorePostHogLogs` call, so no explicit annotation is needed. The\n // queue accessors are parameterized so the programmatic and console instances\n // each bind to their own queue.\n private _createHost(getQueue: () => BufferedLogEntry[], setQueue: (q: BufferedLogEntry[]) => void) {\n const ph = this._instance\n return {\n // The browser gates capture through `is_capturing()` (see `optedOut`).\n get isDisabled() {\n return false\n },\n get optedOut() {\n return !ph.is_capturing()\n },\n // Live queue by reference; core mutates it in place and persists via the setter.\n getPersistedProperty: <T>(key: PostHogPersistedProperty): T | undefined =>\n key === PostHogPersistedProperty.LogsQueue ? (getQueue() as unknown as T) : undefined,\n setPersistedProperty: <T>(key: PostHogPersistedProperty, value: T | null): void => {\n if (key === PostHogPersistedProperty.LogsQueue) {\n setQueue((value as unknown as BufferedLogEntry[]) ?? [])\n }\n },\n _sendLogsBatch: (payload: OtlpLogsPayload) => this._sendLogsBatch(payload),\n getLibraryId: () => Config.LIB_NAME,\n getLibraryVersion: () => Config.LIB_VERSION,\n }\n }\n\n private _sendLogsBatch(payload: OtlpLogsPayload): Promise<SendLogsBatchOutcome> {\n // eslint-disable-next-line compat/compat\n return new Promise((resolve) => {\n if (\n isStatusZeroFailureCircuitBreakerTripped(\n this._consecutiveStatusZeroFailures,\n MAX_CONSECUTIVE_STATUS_ZERO_FAILURES\n )\n ) {\n // Tripped: drop the batch without touching the network. `fatal`\n // advances the queue so records don't pile up while blocked.\n // The `onLine` guard ensures genuine offline periods still queue\n // for the reconnect flush instead of being fatally dropped.\n resolve({ kind: 'fatal', error: new Error('logs endpoint is unreachable, dropping batch') })\n return\n }\n\n let settled = false\n const settle = (outcome: SendLogsBatchOutcome) => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n resolve(outcome)\n }\n\n // Backstop for `_send_request` paths that never call back, so the promise\n // always settles and core's flush can't wedge. Keeps records for retry.\n const timer = setTimeout(\n () => settle({ kind: 'retry-later', error: new Error('logs request timed out') }),\n LOGS_SEND_TIMEOUT_MS\n )\n\n this._instance._send_request({\n method: 'POST',\n url: this._logsUrl(),\n data: payload,\n compression: 'best-available',\n batchKey: 'logs',\n // Notify on the drop paths (not loaded, rate limited) so they retry, not stall.\n fireCallbackOnDrop: true,\n callback: (response) => {\n const status = response.statusCode\n this._trackEndpointReachability(status)\n if (status >= 200 && status < 300) {\n settle({ kind: 'ok' })\n } else if (status === 413) {\n settle({ kind: 'too-large' })\n } else if (status === 0 || status === 429 || status >= 500) {\n // Transient (network / rate-limit / server error): keep and retry.\n settle({\n kind: 'retry-later',\n error: response.error ?? new Error(`logs request failed with status ${status}`),\n })\n } else {\n // Client error (4xx): won't succeed on retry, drop.\n settle({ kind: 'fatal', error: new Error(`logs request failed with status ${status}`) })\n }\n },\n })\n })\n }\n\n // Feeds the status-0 circuit breaker checked at the top of `_sendLogsBatch`.\n private _trackEndpointReachability(statusCode: number): void {\n // Before `init` completes, `_send_request` synthesizes `{ statusCode: 0 }`\n // without any network attempt (the `fireCallbackOnDrop` path), so only\n // post-load failures count — a deferred init must not arrive to an\n // already-tripped breaker. `__loaded` flips on init, not on a successful\n // request, so a blocked-from-the-start page still trips as intended.\n if (statusCode === 0 && !this._instance.__loaded) {\n return\n }\n this._consecutiveStatusZeroFailures = updateStatusZeroFailureCount(\n statusCode,\n this._consecutiveStatusZeroFailures,\n MAX_CONSECUTIVE_STATUS_ZERO_FAILURES,\n () =>\n this._logger.warn(\n 'Log requests are failing before receiving an HTTP response; this can happen due to network issues, CORS, browser blocking, or ad blockers. Stopped sending logs; will try again when connectivity changes.'\n )\n )\n }\n\n // Drains both the programmatic and console queues over the given transport.\n // Each queue carries its own resolved config so the two `service.name`s are\n // preserved. Non-empty queue → its core was built → its resolved config is set,\n // so the length guards also avoid lazily building an unused core for config.\n // TODO: future optimization — merge both into one multi-`resourceLogs` payload\n // so a page-unload only fires a single sendBeacon instead of two.\n private _flushViaTransport(transport: 'XHR' | 'fetch' | 'sendBeacon'): void {\n if (this._queue.length > 0) {\n // Invariant: _resolvedConfig is set whenever _queue has items.\n this._drainQueueViaTransport(transport, this._queue, this._resolvedConfig!, Config.LIB_NAME, (q) => {\n this._queue = q\n })\n }\n if (this._consoleQueue.length > 0) {\n // Invariant: _consoleResolvedConfig is set whenever _consoleQueue has items.\n this._drainQueueViaTransport(\n transport,\n this._consoleQueue,\n this._consoleResolvedConfig!,\n CONSOLE_SCOPE_NAME,\n (q) => {\n this._consoleQueue = q\n }\n )\n }\n }\n\n private _drainQueueViaTransport(\n transport: 'XHR' | 'fetch' | 'sendBeacon',\n queue: BufferedLogEntry[],\n config: ResolvedPostHogLogsConfig,\n scopeName: string,\n setQueue: (q: BufferedLogEntry[]) => void\n ): void {\n if (queue.length === 0) {\n return\n }\n const records = queue.map((e) => e.record)\n setQueue([])\n // Shared with the core flush path so resource attributes can't drift. The\n // scope name labels the stream (console vs SDK); `telemetry.sdk.name` stays\n // the SDK id (`Config.LIB_NAME`) regardless.\n const payload = buildOtlpLogsPayload(\n records,\n buildResourceAttributes(config, Config.LIB_NAME, Config.LIB_VERSION),\n scopeName,\n Config.LIB_VERSION\n )\n // Intentionally bypasses the circuit breaker and does not feed\n // `_trackEndpointReachability`: this is a best-effort \"last gasp\" send\n // (page unload or explicit transport flush) where `sendBeacon` in particular\n // is sometimes honoured even by blockers, and the callback-less path means\n // we can't track the outcome anyway.\n this._instance._send_request({\n method: 'POST',\n url: this._logsUrl(),\n data: payload,\n compression: 'best-available',\n batchKey: 'logs',\n transport,\n })\n }\n\n private _logsUrl(): string {\n return (\n this._instance.requestRouter.endpointFor('api', LOGS_ENDPOINT) +\n '?token=' +\n encodeURIComponent(this._instance.config.token)\n )\n }\n\n private _getSdkContext(): LogSdkContext {\n const context: LogSdkContext = {}\n\n context.distinctId = this._instance.get_distinct_id()\n\n if (this._instance.sessionManager) {\n const { sessionId, windowId, sessionStartTimestamp, lastActivityTimestamp } =\n this._instance.sessionManager.checkAndGetSessionAndWindowId(true)\n context.sessionId = sessionId\n context.windowId = windowId\n if (!isNullish(sessionStartTimestamp)) {\n context.sessionStartTimestamp = sessionStartTimestamp\n }\n if (!isNullish(lastActivityTimestamp)) {\n context.lastActivityTimestamp = lastActivityTimestamp\n }\n }\n\n if (assignableWindow?.location?.href) {\n context.currentUrl = this._instance.config.disable_capture_url_hashes\n ? stripUrlHash(assignableWindow.location.href)\n : assignableWindow.location.href\n }\n\n if (this._instance.featureFlags) {\n const flags = this._instance.featureFlags.getFlags()\n if (flags && flags.length > 0) {\n context.activeFeatureFlags = flags\n }\n }\n\n return context\n }\n}\n","/**\n * Pre-grouped extension bundles for tree-shaking support.\n *\n * Each bundle is self-contained: a feature plus its runtime dependencies.\n * Use these with `__extensionClasses` to control which extensions are included in your bundle.\n * The default `posthog-js` entrypoint includes all extensions. When using `posthog-js/slim`,\n * you can import only the bundles you need:\n *\n * @example\n * ```ts\n * import posthog from 'posthog-js/slim'\n * import { SessionReplayExtensions, AnalyticsExtensions } from 'posthog-js/extensions'\n *\n * posthog.init('ph_key', {\n * __extensionClasses: {\n * ...SessionReplayExtensions,\n * ...AnalyticsExtensions,\n * }\n * })\n * ```\n *\n * @module\n */\n\nimport { Autocapture } from '../autocapture'\nimport { DeadClicksAutocapture } from './dead-clicks-autocapture'\nimport { ExceptionObserver } from './exception-autocapture'\nimport { HistoryAutocapture } from './history-autocapture'\nimport { TracingHeaders } from './tracing-headers'\nimport { WebVitalsAutocapture } from './web-vitals'\nimport { SessionRecording } from './replay/session-recording'\nimport { Heatmaps } from '../heatmaps'\nimport { PostHogProductTours } from '../posthog-product-tours'\nimport { SiteApps } from '../site-apps'\nimport { PostHogConfig } from '../types'\nimport { PostHogSurveys } from '../posthog-surveys'\nimport { Toolbar } from './toolbar'\nimport { PostHogFeatureFlags } from '../posthog-featureflags'\nimport { PostHogExceptions } from '../posthog-exceptions'\nimport { WebExperiments } from '../web-experiments'\nimport { PostHogConversations } from './conversations/posthog-conversations'\nimport { PostHogLogs } from '../posthog-logs'\nimport { PostHogMetrics } from '../posthog-metrics'\n\ntype ExtensionClasses = NonNullable<PostHogConfig['__extensionClasses']>\n\n/** Feature flags. */\nexport const FeatureFlagsExtensions = {\n featureFlags: PostHogFeatureFlags,\n} as const satisfies ExtensionClasses\n\n/** Session replay. */\nexport const SessionReplayExtensions = {\n sessionRecording: SessionRecording,\n} as const satisfies ExtensionClasses\n\n/** Autocapture, click tracking, heatmaps, and web vitals. */\nexport const AnalyticsExtensions = {\n autocapture: Autocapture,\n historyAutocapture: HistoryAutocapture,\n heatmaps: Heatmaps,\n deadClicksAutocapture: DeadClicksAutocapture,\n webVitalsAutocapture: WebVitalsAutocapture,\n} as const satisfies ExtensionClasses\n\n/** Exception and error capture. Requires both the observer (capture hook) and exceptions (forwarding). */\nexport const ErrorTrackingExtensions = {\n exceptionObserver: ExceptionObserver,\n exceptions: PostHogExceptions,\n} as const satisfies ExtensionClasses\n\n/** In-app product tours. Includes feature flags for targeting. */\nexport const ProductToursExtensions = {\n productTours: PostHogProductTours,\n ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** Site apps support. */\nexport const SiteAppsExtensions = {\n siteApps: SiteApps,\n} as const satisfies ExtensionClasses\n\n/** Distributed tracing header injection. */\nexport const TracingExtensions = {\n tracingHeaders: TracingHeaders,\n} as const satisfies ExtensionClasses\n\n/** In-app surveys. Includes feature flags for targeting. */\nexport const SurveysExtensions = {\n surveys: PostHogSurveys,\n ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** PostHog toolbar for visual element inspection and action setup. */\nexport const ToolbarExtensions = {\n toolbar: Toolbar,\n} as const satisfies ExtensionClasses\n\n/** Web experiments. Includes feature flags for variant evaluation. */\nexport const ExperimentsExtensions = {\n experiments: WebExperiments,\n ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** In-app conversations. */\nexport const ConversationsExtensions = {\n conversations: PostHogConversations,\n} as const satisfies ExtensionClasses\n\n/** Console log capture. */\nexport const LogsExtensions = {\n logs: PostHogLogs,\n} as const satisfies ExtensionClasses\n\n/** The posthog.metrics API (count, gauge, histogram). */\nexport const MetricsExtensions = {\n metrics: PostHogMetrics,\n} as const satisfies ExtensionClasses\n\n/** All extensions — equivalent to the default `posthog-js` bundle. */\nexport const AllExtensions = {\n ...FeatureFlagsExtensions,\n ...SessionReplayExtensions,\n ...AnalyticsExtensions,\n ...ErrorTrackingExtensions,\n ...ProductToursExtensions,\n ...SiteAppsExtensions,\n ...SurveysExtensions,\n ...TracingExtensions,\n ...ToolbarExtensions,\n ...ExperimentsExtensions,\n ...ConversationsExtensions,\n ...LogsExtensions,\n ...MetricsExtensions,\n} as const satisfies ExtensionClasses\n","import { PostHog } from '../posthog-core'\nimport { EVENT_PAGEVIEW } from '../constants'\nimport { window } from '@posthog/browser-common/utils/globals'\nimport { addEventListener } from '@posthog/browser-common/utils/general-utils'\nimport { logger } from '@posthog/browser-common/utils/logger'\nimport { patch } from './replay/rrweb-plugins/patch'\nimport type { Extension } from './types'\n\n/**\n * This class is used to capture pageview events when the user navigates using the history API (pushState, replaceState)\n * and when the user navigates using the browser's back/forward buttons.\n *\n * The behavior is controlled by the `capture_pageview` configuration option:\n * - When set to `'history_change'`, this class will capture pageviews on history API changes\n */\nexport class HistoryAutocapture implements Extension {\n private _instance: PostHog\n private _popstateListener: (() => void) | undefined\n private _lastPathname: string\n\n constructor(instance: PostHog) {\n this._instance = instance\n this._lastPathname = window?.location?.pathname || ''\n }\n\n initialize() {\n this.startIfEnabled()\n }\n\n public get isEnabled(): boolean {\n return this._instance.config.capture_pageview === 'history_change'\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled) {\n logger.info('History API monitoring enabled, starting...')\n this.monitorHistoryChanges()\n }\n }\n\n public stop(): void {\n if (this._popstateListener) {\n this._popstateListener()\n }\n this._popstateListener = undefined\n logger.info('History API monitoring stopped')\n }\n\n public monitorHistoryChanges(): void {\n if (!window || !window.history) {\n return\n }\n\n this._patchHistoryMethod('pushState')\n this._patchHistoryMethod('replaceState')\n\n this._setupPopstateListener()\n }\n\n private _patchHistoryMethod(method: 'pushState' | 'replaceState'): void {\n if (!window || (window.history[method] as any)?.__posthog_wrapped__) {\n return\n }\n\n // Old fashioned, we could also use arrow functions but I think the closure for a patch is more reliable\n const self = this\n patch(window.history, method, (originalMethod) => {\n return function patchedHistoryMethod(\n this: History,\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n ;(originalMethod as (state: any, title: string, url?: string | URL | null) => void).call(\n this,\n state,\n title,\n url\n )\n self._capturePageview(method)\n }\n })\n }\n\n private _capturePageview(navigationType: 'pushState' | 'replaceState' | 'popstate'): void {\n try {\n const currentPathname = window?.location?.pathname\n\n if (!currentPathname) {\n return\n }\n\n // Only capture pageview if the pathname has changed and the feature is enabled\n if (currentPathname !== this._lastPathname && this.isEnabled) {\n this._instance.capture(EVENT_PAGEVIEW, { navigation_type: navigationType })\n }\n\n this._lastPathname = currentPathname\n } catch (error) {\n logger.error(`Error capturing ${navigationType} pageview`, error)\n }\n }\n\n private _setupPopstateListener(): void {\n if (this._popstateListener) {\n return\n }\n\n const handler = () => {\n this._capturePageview('popstate')\n }\n\n addEventListener(window, 'popstate', handler)\n this._popstateListener = () => {\n if (window) {\n window.removeEventListener('popstate', handler)\n }\n }\n }\n}\n","import type { LogCaptureOptions } from '@posthog/types'\nimport type { ResolvedPostHogLogsConfig } from '@posthog/core'\nimport { isUndefined } from '@posthog/core'\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 3000\nconst DEFAULT_MAX_BUFFER_SIZE = 100\nconst DEFAULT_MAX_LOGS_PER_INTERVAL = 1000\n// Console runs uncapped, so this buffer depth is its only drop protection.\nconst DEFAULT_CONSOLE_MAX_QUEUE_SIZE = 2048\nconst DEFAULT_MAX_BATCH_RECORDS_PER_POST = 100\n\n/**\n * Resolves the public `logs` config into the shape core `PostHogLogs` consumes.\n *\n * `serviceNameDefault` is the console instance's `service.name` fallback\n * (`posthog-browser-logs`); the programmatic instance falls back to core's\n * `unknown_service`. `consoleCapture` disables the per-interval rate cap entirely\n * (even when the user set `maxLogsPerInterval`), so console capture is never\n * rate-dropped — the deep buffer is its only bound.\n */\nexport function resolveLogsConfig(\n config: LogCaptureOptions | undefined,\n opts?: { serviceNameDefault?: string; consoleCapture?: boolean }\n): ResolvedPostHogLogsConfig {\n const flushIntervalMs = config?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS\n const maxBufferSize = config?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE\n const maxLogsPerInterval = opts?.consoleCapture\n ? undefined\n : (config?.maxLogsPerInterval ?? DEFAULT_MAX_LOGS_PER_INTERVAL)\n const maxQueueSize = isUndefined(maxLogsPerInterval)\n ? Math.max(maxBufferSize, DEFAULT_CONSOLE_MAX_QUEUE_SIZE)\n : Math.max(maxBufferSize, maxLogsPerInterval)\n // OTLP keys in `resourceAttributes` take precedence over the named config fields.\n const resourceAttributes = config?.resourceAttributes\n return {\n serviceName:\n (resourceAttributes?.['service.name'] as string | undefined) ??\n config?.serviceName ??\n opts?.serviceNameDefault,\n serviceVersion: (resourceAttributes?.['service.version'] as string | undefined) ?? config?.serviceVersion,\n environment: (resourceAttributes?.['deployment.environment'] as string | undefined) ?? config?.environment,\n resourceAttributes,\n beforeSend: config?.beforeSend,\n flushIntervalMs,\n maxBufferSize,\n maxQueueSize,\n maxBatchRecordsPerPost: DEFAULT_MAX_BATCH_RECORDS_PER_POST,\n rateCapWindowMs: flushIntervalMs,\n maxLogsPerInterval,\n // Mobile-only budgets; the browser drains on pagehide via sendBeacon.\n backgroundFlushBudgetMs: 0,\n terminationFlushBudgetMs: 0,\n }\n}\n","import Config from './config'\nimport { PostHog } from './posthog-core'\nimport type { CaptureMetricOptions, OtlpMetricsPayload } from './types'\nimport { PostHogMetrics as CorePostHogMetrics, resolveMetricsConfig } from '@posthog/core'\nimport type { SendMetricsBatchOutcome } from '@posthog/core'\nimport { createLogger } from '@posthog/browser-common/utils/logger'\nimport { Extension } from './extensions/types'\n\nconst METRICS_ENDPOINT = '/i/v1/metrics'\n// Safety backstop for a `_send_request` that never calls back — same policy\n// as logs: above the request layer's own 60s timeout so a real request\n// always settles via its callback first.\nconst METRICS_SEND_TIMEOUT_MS = 90000\n\n/**\n * The `posthog.metrics` extension: a statsd-style pre-aggregating client.\n *\n * ```ts\n * posthog.metrics.count('orders_created', 1)\n * posthog.metrics.gauge('active_connections', 42)\n * posthog.metrics.histogram('api_latency', 187, { unit: 'ms' })\n * ```\n *\n * Aggregation, series identity, and flush policy live in core's\n * `PostHogMetrics`; this wrapper adapts it to the browser request layer.\n */\nexport class PostHogMetrics implements Extension {\n private readonly _logger = createLogger('[metrics]')\n\n private _core: CorePostHogMetrics | undefined\n // The `metrics` config the current `_core` was built from; a change rebuilds it.\n private _resolvedFrom: PostHog['config']['metrics']\n\n constructor(private readonly _instance: PostHog) {}\n\n // Nothing to set up eagerly — the aggregator builds lazily on the first\n // capture so it sees post-init config. Present so the class satisfies the\n // weakly-typed `Extension` contract.\n initialize(): void {}\n\n // The extension is constructed before `init` applies config, so build the\n // core lazily and rebuild when `config.metrics` is swapped (e.g. via\n // `set_config`). A rebuild drops the old core's pending window — acceptable\n // for a config swap, which is rare and usually happens at startup.\n private _getCore(): CorePostHogMetrics {\n const metricsConfig = this._instance?.config?.metrics\n if (!this._core || this._resolvedFrom !== metricsConfig) {\n this._core?.reset()\n this._resolvedFrom = metricsConfig\n this._core = new CorePostHogMetrics(this._createHost(), resolveMetricsConfig(metricsConfig), this._logger)\n }\n return this._core\n }\n\n /** Add to a counter — things that only go up. Value defaults to 1. */\n count(name: string, value: number = 1, options?: CaptureMetricOptions): void {\n this._getCore().count(name, value, options)\n }\n\n /** Record the current value of something that goes up and down. */\n gauge(name: string, value: number, options?: CaptureMetricOptions): void {\n this._getCore().gauge(name, value, options)\n }\n\n /** Record one observation of a distribution (latency, payload size). */\n histogram(name: string, value: number, options?: CaptureMetricOptions): void {\n this._getCore().histogram(name, value, options)\n }\n\n /**\n * Sends the aggregated window now. With a transport, the window is\n * drained synchronously — bypassing the flush serializer, which could be\n * awaiting an in-flight send that will never finish during unload — and\n * the payload is handed to that transport in the same tick, so the\n * pagehide `sendBeacon` drain survives the page going away. A drained\n * window is not retried; the page is gone either way.\n */\n flush(transport?: 'XHR' | 'fetch' | 'sendBeacon'): Promise<void> {\n if (!this._core) {\n return Promise.resolve()\n }\n if (transport) {\n const payload = this._core.drainWindow()\n if (payload) {\n void this._sendMetricsBatch(payload, transport)\n }\n\n return Promise.resolve()\n }\n return this._core.flush().catch((err) => this._logger.error('PostHog metrics flush failed:', err))\n }\n\n reset(): void {\n this._core?.reset()\n }\n\n // Host adapter for core's `PostHogMetrics`; structurally checked against\n // `MetricsHost` at the `new CorePostHogMetrics` call.\n private _createHost() {\n const ph = this._instance\n const self = this\n return {\n get isDisabled() {\n return false\n },\n // The browser gates capture through `is_capturing()`.\n get optedOut() {\n return !ph.is_capturing()\n },\n _sendMetricsBatch: (payload: OtlpMetricsPayload) => self._sendMetricsBatch(payload),\n getLibraryId: () => Config.LIB_NAME,\n getLibraryVersion: () => Config.LIB_VERSION,\n }\n }\n\n private _sendMetricsBatch(\n payload: OtlpMetricsPayload,\n transport?: 'XHR' | 'fetch' | 'sendBeacon'\n ): Promise<SendMetricsBatchOutcome> {\n // eslint-disable-next-line compat/compat\n return new Promise((resolve) => {\n let settled = false\n const settle = (outcome: SendMetricsBatchOutcome): void => {\n if (settled) {\n return\n }\n settled = true\n clearTimeout(timer)\n resolve(outcome)\n }\n\n // Backstop for `_send_request` paths that never call back, so the\n // promise always settles and core's flush can't wedge.\n const timer = setTimeout(\n () => settle({ kind: 'retry-later', error: new Error('metrics request timed out') }),\n METRICS_SEND_TIMEOUT_MS\n )\n\n this._instance._send_request({\n method: 'POST',\n url: this._metricsUrl(),\n data: payload,\n compression: 'best-available',\n batchKey: 'metrics',\n ...(transport && { transport }),\n // Notify on the drop paths (not loaded, rate limited) so they retry, not stall.\n fireCallbackOnDrop: true,\n callback: (response) => {\n const status = response.statusCode\n if (status >= 200 && status < 300) {\n settle({ kind: 'ok' })\n } else if (status === 413) {\n settle({ kind: 'too-large' })\n } else if (status === 0 || status === 429 || status >= 500) {\n // Transient (network / rate-limit / server error): keep and retry.\n settle({\n kind: 'retry-later',\n error: response.error ?? new Error(`metrics request failed with status ${status}`),\n })\n } else {\n // Client error (4xx): won't succeed on retry, drop.\n settle({ kind: 'fatal', error: new Error(`metrics request failed with status ${status}`) })\n }\n },\n })\n })\n }\n\n private _metricsUrl(): string {\n return (\n this._instance.requestRouter.endpointFor('api', METRICS_ENDPOINT) +\n '?token=' +\n encodeURIComponent(this._instance.config.token)\n )\n }\n}\n","const DEFAULT_FLUSH_INTERVAL_MS = 10000;\nconst DEFAULT_MAX_SERIES_PER_FLUSH = 1000;\nfunction resolveMetricsConfig(config) {\n const resourceAttributes = config?.resourceAttributes;\n return {\n serviceName: resourceAttributes?.['service.name'] ?? config?.serviceName,\n serviceVersion: resourceAttributes?.['service.version'] ?? config?.serviceVersion,\n environment: resourceAttributes?.['deployment.environment'] ?? config?.environment,\n resourceAttributes,\n beforeSend: config?.beforeSend,\n flushIntervalMs: config?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n maxSeriesPerFlush: config?.maxSeriesPerFlush ?? DEFAULT_MAX_SERIES_PER_FLUSH\n };\n}\nexport { resolveMetricsConfig };\n","import { PostHog } from '../posthog-core'\nimport { AllExtensions } from '../extensions/extension-bundles'\n\nPostHog.__defaultExtensionClasses = {\n ...AllExtensions,\n}\n","import './default-extensions'\nimport { init_as_module } from '../posthog-core'\n\nexport { PostHog } from '../posthog-core'\nexport * from '../types'\nexport * from '../posthog-surveys-types'\nexport * from '../posthog-product-tours-types'\nexport * from '../posthog-conversations-types'\n\n/**\n * The default PostHog JavaScript Web SDK singleton instance.\n */\nexport const posthog = init_as_module()\nexport default posthog\n"]}
|