@hexclave/next 1.0.41 → 1.0.43
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/account-settings-cTsj8rpJ.d.ts +56 -0
- package/dist/account-settings-cTsj8rpJ.d.ts.map +1 -0
- package/dist/admin-app-impl-DgLL2Tua.d.ts +1282 -0
- package/dist/admin-app-impl-DgLL2Tua.d.ts.map +1 -0
- package/dist/auth-page-YnM_LtbN.d.ts +24 -0
- package/dist/auth-page-YnM_LtbN.d.ts.map +1 -0
- package/dist/cli-auth-confirm-BW3PYpKb.d.ts +19 -0
- package/dist/cli-auth-confirm-BW3PYpKb.d.ts.map +1 -0
- package/dist/clickmap/clickmap-core.d.ts +1 -2
- package/dist/clickmap/clickmap-core.d.ts.map +1 -1
- package/dist/clickmap/clickmap-core.js +4 -6
- package/dist/clickmap/clickmap-core.js.map +1 -1
- package/dist/clickmap/clickmap-styles.js +3 -6
- package/dist/clickmap/clickmap-styles.js.map +1 -1
- package/dist/clickmap/index.d.ts +1 -2
- package/dist/clickmap/index.d.ts.map +1 -1
- package/dist/clickmap/index.js +4 -6
- package/dist/clickmap/index.js.map +1 -1
- package/dist/client-app-Bi8p4lxS.d.ts +1359 -0
- package/dist/client-app-Bi8p4lxS.d.ts.map +1 -0
- package/dist/common-B2gkWlXX.d.ts +183 -0
- package/dist/common-B2gkWlXX.d.ts.map +1 -0
- package/dist/common-BK_sydxF.d.ts +66 -0
- package/dist/common-BK_sydxF.d.ts.map +1 -0
- package/dist/components/api-key-dialogs.d.ts +3 -4
- package/dist/components/api-key-dialogs.d.ts.map +1 -1
- package/dist/components/api-key-dialogs.js +5 -8
- package/dist/components/api-key-dialogs.js.map +1 -1
- package/dist/components/api-key-table.d.ts +2 -3
- package/dist/components/api-key-table.d.ts.map +1 -1
- package/dist/components/api-key-table.js +3 -6
- package/dist/components/api-key-table.js.map +1 -1
- package/dist/components/credential-sign-in.d.ts +2 -7
- package/dist/components/credential-sign-in.js +4 -7
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.d.ts +2 -9
- package/dist/components/credential-sign-up.js +7 -9
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/form-warning.d.ts +1 -3
- package/dist/components/elements/form-warning.d.ts.map +1 -1
- package/dist/components/elements/form-warning.js +3 -6
- package/dist/components/elements/form-warning.js.map +1 -1
- package/dist/components/elements/maybe-full-page.d.ts +1 -2
- package/dist/components/elements/maybe-full-page.d.ts.map +1 -1
- package/dist/components/elements/maybe-full-page.js +4 -6
- package/dist/components/elements/maybe-full-page.js.map +1 -1
- package/dist/components/elements/separator-with-text.d.ts +1 -3
- package/dist/components/elements/separator-with-text.d.ts.map +1 -1
- package/dist/components/elements/separator-with-text.js +3 -6
- package/dist/components/elements/separator-with-text.js.map +1 -1
- package/dist/components/elements/sidebar-layout.d.ts +1 -2
- package/dist/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/components/elements/sidebar-layout.js +5 -7
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/ssr-layout-effect.d.ts +1 -3
- package/dist/components/elements/ssr-layout-effect.d.ts.map +1 -1
- package/dist/components/elements/ssr-layout-effect.js +2 -5
- package/dist/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/components/elements/user-avatar.d.ts +2 -15
- package/dist/components/elements/user-avatar.js +2 -4
- package/dist/components/elements/user-avatar.js.map +1 -1
- package/dist/components/link.d.ts +2 -4
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +5 -7
- package/dist/components/link.js.map +1 -1
- package/dist/components/magic-link-sign-in.d.ts +2 -7
- package/dist/components/magic-link-sign-in.js +4 -7
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/known-error-message-card.d.ts +1 -2
- package/dist/components/message-cards/known-error-message-card.d.ts.map +1 -1
- package/dist/components/message-cards/known-error-message-card.js +2 -5
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/message-card.d.ts +2 -19
- package/dist/components/message-cards/message-card.js +5 -7
- package/dist/components/message-cards/message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.d.ts +1 -3
- package/dist/components/message-cards/predefined-message-card.d.ts.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +2 -5
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button-group.d.ts +2 -19
- package/dist/components/oauth-button-group.js +3 -6
- package/dist/components/oauth-button-group.js.map +1 -1
- package/dist/components/oauth-button.d.ts +2 -17
- package/dist/components/oauth-button.js +5 -7
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.d.ts +1 -3
- package/dist/components/passkey-button.d.ts.map +1 -1
- package/dist/components/passkey-button.js +3 -6
- package/dist/components/passkey-button.js.map +1 -1
- package/dist/components/profile-image-editor.d.ts +2 -3
- package/dist/components/profile-image-editor.d.ts.map +1 -1
- package/dist/components/profile-image-editor.js +5 -6
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.d.ts +2 -31
- package/dist/components/selected-team-switcher.js +3 -6
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/team-icon.d.ts +2 -4
- package/dist/components/team-icon.d.ts.map +1 -1
- package/dist/components/team-icon.js +2 -4
- package/dist/components/team-icon.js.map +1 -1
- package/dist/components/team-switcher.d.ts +2 -31
- package/dist/components/team-switcher.js +4 -7
- package/dist/components/team-switcher.js.map +1 -1
- package/dist/components/use-in-iframe.d.ts.map +1 -1
- package/dist/components/use-in-iframe.js +3 -6
- package/dist/components/use-in-iframe.js.map +1 -1
- package/dist/components/user-button.d.ts +2 -22
- package/dist/components/user-button.js +5 -7
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts +1 -3
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +3 -5
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts +1 -3
- package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.js +2 -4
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.d.ts +1 -3
- package/dist/components-page/account-settings/editable-text.d.ts.map +1 -1
- package/dist/components-page/account-settings/editable-text.js +2 -4
- package/dist/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +3 -5
- package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js +6 -7
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js +5 -6
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.d.ts +1 -3
- package/dist/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.js +2 -4
- package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/components-page/account-settings/page-layout.d.ts +1 -3
- package/dist/components-page/account-settings/page-layout.d.ts.map +1 -1
- package/dist/components-page/account-settings/page-layout.js +2 -4
- package/dist/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.d.ts +2 -4
- package/dist/components-page/account-settings/payments/payments-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.js +3 -6
- package/dist/components-page/account-settings/payments/payments-page.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-panel.d.ts +2 -3
- package/dist/components-page/account-settings/payments/payments-panel.d.ts.map +1 -1
- package/dist/components-page/account-settings/payments/payments-panel.js +3 -6
- package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/components-page/account-settings/profile-page/profile-page.d.ts +1 -3
- package/dist/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/profile-page/profile-page.js +2 -4
- package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/components-page/account-settings/section.d.ts +1 -3
- package/dist/components-page/account-settings/section.d.ts.map +1 -1
- package/dist/components-page/account-settings/section.js +2 -4
- package/dist/components-page/account-settings/section.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.d.ts +1 -3
- package/dist/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js +2 -4
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.d.ts +1 -3
- package/dist/components-page/account-settings/settings/settings-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.js +2 -4
- package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.d.ts +1 -3
- package/dist/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js +2 -4
- package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.js +2 -4
- package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +2 -3
- package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.d.ts +1 -3
- package/dist/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js +3 -5
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js +3 -5
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.js +2 -4
- package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/components-page/account-settings.d.ts +2 -58
- package/dist/components-page/account-settings.js +5 -7
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.d.ts +2 -26
- package/dist/components-page/auth-page.js +4 -7
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.d.ts +2 -21
- package/dist/components-page/cli-auth-confirm.js +4 -7
- package/dist/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.test.js +4 -5
- package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/components-page/email-verification.d.ts +2 -10
- package/dist/components-page/email-verification.js +5 -7
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.d.ts +2 -10
- package/dist/components-page/error-page.js +3 -6
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.d.ts +2 -14
- package/dist/components-page/forgot-password.js +4 -7
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/hexclave-handler-client.d.ts +2 -62
- package/dist/components-page/hexclave-handler-client.js +2 -5
- package/dist/components-page/hexclave-handler-client.js.map +1 -1
- package/dist/components-page/hexclave-handler-client.test.js +1 -3
- package/dist/components-page/hexclave-handler-client.test.js.map +1 -1
- package/dist/components-page/hexclave-handler.d.ts +2 -37
- package/dist/components-page/hexclave-handler.js +5 -4
- package/dist/components-page/hexclave-handler.js.map +1 -1
- package/dist/components-page/magic-link-callback.d.ts +2 -10
- package/dist/components-page/magic-link-callback.js +6 -9
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.d.ts +2 -11
- package/dist/components-page/mfa.js +2 -5
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.d.ts +2 -11
- package/dist/components-page/oauth-callback.js +5 -8
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/components-page/oauth-callback.test.js +4 -5
- package/dist/components-page/oauth-callback.test.js.map +1 -1
- package/dist/components-page/onboarding.d.ts +2 -9
- package/dist/components-page/onboarding.js +4 -7
- package/dist/components-page/onboarding.js.map +1 -1
- package/dist/components-page/password-reset.d.ts +2 -17
- package/dist/components-page/password-reset.js +9 -8
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/section.js +2 -2
- package/dist/components-page/sign-in.d.ts +2 -23
- package/dist/components-page/sign-in.js +2 -4
- package/dist/components-page/sign-in.js.map +1 -1
- package/dist/components-page/sign-out.d.ts +2 -10
- package/dist/components-page/sign-out.js +3 -6
- package/dist/components-page/sign-out.js.map +1 -1
- package/dist/components-page/sign-up.d.ts +2 -13
- package/dist/components-page/sign-up.js +3 -6
- package/dist/components-page/sign-up.js.map +1 -1
- package/dist/components-page/team-creation.d.ts +1 -3
- package/dist/components-page/team-creation.d.ts.map +1 -1
- package/dist/components-page/team-creation.js +4 -7
- package/dist/components-page/team-creation.js.map +1 -1
- package/dist/components-page/team-invitation.d.ts +2 -13
- package/dist/components-page/team-invitation.js +5 -7
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/config.js +17 -19
- package/dist/convex-D2mFhYyd.d.ts +13 -0
- package/dist/convex-D2mFhYyd.d.ts.map +1 -0
- package/dist/cookie-DTOQvCYn.d.ts +42 -0
- package/dist/cookie-DTOQvCYn.d.ts.map +1 -0
- package/dist/credential-sign-in-BxCi9NEV.d.ts +5 -0
- package/dist/credential-sign-in-BxCi9NEV.d.ts.map +1 -0
- package/dist/credential-sign-up-tYm5rV86.d.ts +7 -0
- package/dist/credential-sign-up-tYm5rV86.d.ts.map +1 -0
- package/dist/dev-tool/dev-tool-core.d.ts +1 -2
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +4 -6
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-styles.js +3 -6
- package/dist/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.js +6 -7
- package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -3
- package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/dev-tool/index.d.ts +1 -2
- package/dist/dev-tool/index.d.ts.map +1 -1
- package/dist/dev-tool/index.js +4 -6
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/email-verification-Cr_KKvtQ.d.ts +8 -0
- package/dist/email-verification-Cr_KKvtQ.d.ts.map +1 -0
- package/dist/error-page-D0KwN73t.d.ts +8 -0
- package/dist/error-page-D0KwN73t.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-core.d.ts +1 -1
- package/dist/esm/clickmap/clickmap-core.d.ts.map +1 -1
- package/dist/esm/clickmap/clickmap-core.js +3 -4
- package/dist/esm/clickmap/clickmap-core.js.map +1 -1
- package/dist/esm/clickmap/clickmap-styles.js +1 -2
- package/dist/esm/clickmap/clickmap-styles.js.map +1 -1
- package/dist/esm/clickmap/index.d.ts +1 -1
- package/dist/esm/clickmap/index.d.ts.map +1 -1
- package/dist/esm/clickmap/index.js +3 -4
- package/dist/esm/clickmap/index.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.d.ts +3 -4
- package/dist/esm/components/api-key-dialogs.d.ts.map +1 -1
- package/dist/esm/components/api-key-dialogs.js +4 -6
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/api-key-table.d.ts +2 -3
- package/dist/esm/components/api-key-table.d.ts.map +1 -1
- package/dist/esm/components/api-key-table.js +2 -4
- package/dist/esm/components/api-key-table.js.map +1 -1
- package/dist/esm/components/credential-sign-in.d.ts +1 -3
- package/dist/esm/components/credential-sign-in.d.ts.map +1 -1
- package/dist/esm/components/credential-sign-in.js +3 -5
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.d.ts +1 -3
- package/dist/esm/components/credential-sign-up.d.ts.map +1 -1
- package/dist/esm/components/credential-sign-up.js +4 -6
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/form-warning.d.ts +1 -3
- package/dist/esm/components/elements/form-warning.d.ts.map +1 -1
- package/dist/esm/components/elements/form-warning.js +2 -4
- package/dist/esm/components/elements/form-warning.js.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.d.ts +1 -2
- package/dist/esm/components/elements/maybe-full-page.d.ts.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.js +2 -4
- package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
- package/dist/esm/components/elements/separator-with-text.d.ts +1 -3
- package/dist/esm/components/elements/separator-with-text.d.ts.map +1 -1
- package/dist/esm/components/elements/separator-with-text.js +2 -4
- package/dist/esm/components/elements/separator-with-text.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.d.ts +1 -2
- package/dist/esm/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js +3 -5
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.d.ts +1 -3
- package/dist/esm/components/elements/ssr-layout-effect.d.ts.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.js +1 -3
- package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.d.ts +1 -3
- package/dist/esm/components/elements/user-avatar.d.ts.map +1 -1
- package/dist/esm/components/elements/user-avatar.js +1 -2
- package/dist/esm/components/elements/user-avatar.js.map +1 -1
- package/dist/esm/components/link.d.ts +2 -4
- package/dist/esm/components/link.d.ts.map +1 -1
- package/dist/esm/components/link.js +2 -4
- package/dist/esm/components/link.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.d.ts +1 -3
- package/dist/esm/components/magic-link-sign-in.d.ts.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js +3 -5
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.d.ts +1 -2
- package/dist/esm/components/message-cards/known-error-message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js +1 -3
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/message-card.d.ts +1 -2
- package/dist/esm/components/message-cards/message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/message-card.js +3 -5
- package/dist/esm/components/message-cards/message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.d.ts +1 -3
- package/dist/esm/components/message-cards/predefined-message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +1 -3
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button-group.d.ts +1 -3
- package/dist/esm/components/oauth-button-group.d.ts.map +1 -1
- package/dist/esm/components/oauth-button-group.js +2 -4
- package/dist/esm/components/oauth-button-group.js.map +1 -1
- package/dist/esm/components/oauth-button.d.ts +1 -3
- package/dist/esm/components/oauth-button.d.ts.map +1 -1
- package/dist/esm/components/oauth-button.js +2 -4
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.d.ts +1 -3
- package/dist/esm/components/passkey-button.d.ts.map +1 -1
- package/dist/esm/components/passkey-button.js +2 -4
- package/dist/esm/components/passkey-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.d.ts +2 -3
- package/dist/esm/components/profile-image-editor.d.ts.map +1 -1
- package/dist/esm/components/profile-image-editor.js +1 -2
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.d.ts +2 -3
- package/dist/esm/components/selected-team-switcher.d.ts.map +1 -1
- package/dist/esm/components/selected-team-switcher.js +2 -4
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/team-icon.d.ts +2 -3
- package/dist/esm/components/team-icon.d.ts.map +1 -1
- package/dist/esm/components/team-icon.js +1 -2
- package/dist/esm/components/team-icon.js.map +1 -1
- package/dist/esm/components/team-switcher.d.ts +2 -3
- package/dist/esm/components/team-switcher.d.ts.map +1 -1
- package/dist/esm/components/team-switcher.js +3 -5
- package/dist/esm/components/team-switcher.js.map +1 -1
- package/dist/esm/components/use-in-iframe.d.ts.map +1 -1
- package/dist/esm/components/use-in-iframe.js +2 -4
- package/dist/esm/components/use-in-iframe.js.map +1 -1
- package/dist/esm/components/user-button.d.ts +1 -2
- package/dist/esm/components/user-button.d.ts.map +1 -1
- package/dist/esm/components/user-button.js +3 -5
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +2 -3
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js +1 -2
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.d.ts +1 -3
- package/dist/esm/components-page/account-settings/editable-text.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js +1 -2
- package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +2 -3
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +3 -4
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +2 -3
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js +1 -2
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.d.ts +1 -3
- package/dist/esm/components-page/account-settings/page-layout.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.js +1 -2
- package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.d.ts +2 -3
- package/dist/esm/components-page/account-settings/payments/payments-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.js +2 -4
- package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +2 -3
- package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.js +2 -4
- package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js +1 -2
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/section.js +1 -2
- package/dist/esm/components-page/account-settings/section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js +1 -2
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/settings-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.js +1 -2
- package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js +1 -2
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js +2 -3
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +2 -3
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/esm/components-page/account-settings.d.ts +9 -11
- package/dist/esm/components-page/account-settings.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings.js +3 -5
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.d.ts +1 -3
- package/dist/esm/components-page/auth-page.d.ts.map +1 -1
- package/dist/esm/components-page/auth-page.js +3 -5
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.d.ts +1 -3
- package/dist/esm/components-page/cli-auth-confirm.d.ts.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js +3 -5
- package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.test.js +4 -5
- package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/esm/components-page/email-verification.d.ts +1 -3
- package/dist/esm/components-page/email-verification.d.ts.map +1 -1
- package/dist/esm/components-page/email-verification.js +2 -4
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.d.ts +1 -3
- package/dist/esm/components-page/error-page.d.ts.map +1 -1
- package/dist/esm/components-page/error-page.js +2 -4
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.d.ts +2 -4
- package/dist/esm/components-page/forgot-password.d.ts.map +1 -1
- package/dist/esm/components-page/forgot-password.js +3 -5
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.d.ts +14 -14
- package/dist/esm/components-page/hexclave-handler-client.d.ts.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.js +1 -3
- package/dist/esm/components-page/hexclave-handler-client.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.test.js +2 -3
- package/dist/esm/components-page/hexclave-handler-client.test.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler.d.ts +2 -3
- package/dist/esm/components-page/hexclave-handler.d.ts.map +1 -1
- package/dist/esm/components-page/hexclave-handler.js +1 -2
- package/dist/esm/components-page/hexclave-handler.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.d.ts +1 -3
- package/dist/esm/components-page/magic-link-callback.d.ts.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js +2 -4
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.d.ts +1 -3
- package/dist/esm/components-page/mfa.d.ts.map +1 -1
- package/dist/esm/components-page/mfa.js +1 -3
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.d.ts +1 -3
- package/dist/esm/components-page/oauth-callback.d.ts.map +1 -1
- package/dist/esm/components-page/oauth-callback.js +4 -6
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.test.js +4 -5
- package/dist/esm/components-page/oauth-callback.test.js.map +1 -1
- package/dist/esm/components-page/onboarding.d.ts +1 -3
- package/dist/esm/components-page/onboarding.d.ts.map +1 -1
- package/dist/esm/components-page/onboarding.js +3 -5
- package/dist/esm/components-page/onboarding.js.map +1 -1
- package/dist/esm/components-page/password-reset.d.ts +2 -4
- package/dist/esm/components-page/password-reset.d.ts.map +1 -1
- package/dist/esm/components-page/password-reset.js +3 -5
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/section.js +3 -4
- package/dist/esm/components-page/sign-in.d.ts +1 -3
- package/dist/esm/components-page/sign-in.d.ts.map +1 -1
- package/dist/esm/components-page/sign-in.js +1 -2
- package/dist/esm/components-page/sign-in.js.map +1 -1
- package/dist/esm/components-page/sign-out.d.ts +1 -3
- package/dist/esm/components-page/sign-out.d.ts.map +1 -1
- package/dist/esm/components-page/sign-out.js +2 -4
- package/dist/esm/components-page/sign-out.js.map +1 -1
- package/dist/esm/components-page/sign-up.d.ts +1 -3
- package/dist/esm/components-page/sign-up.d.ts.map +1 -1
- package/dist/esm/components-page/sign-up.js +2 -4
- package/dist/esm/components-page/sign-up.js.map +1 -1
- package/dist/esm/components-page/team-creation.d.ts +1 -3
- package/dist/esm/components-page/team-creation.d.ts.map +1 -1
- package/dist/esm/components-page/team-creation.js +3 -5
- package/dist/esm/components-page/team-creation.js.map +1 -1
- package/dist/esm/components-page/team-invitation.d.ts +1 -3
- package/dist/esm/components-page/team-invitation.d.ts.map +1 -1
- package/dist/esm/components-page/team-invitation.js +2 -4
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/config.js +1 -2
- package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +3 -4
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.js +1 -2
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.js +5 -5
- package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +2 -3
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts +1 -1
- package/dist/esm/dev-tool/index.d.ts.map +1 -1
- package/dist/esm/dev-tool/index.js +3 -4
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/generated/env.js +1 -1
- package/dist/esm/generated/env.js.map +1 -1
- package/dist/esm/generated/global-css.d.ts +1 -1
- package/dist/esm/generated/global-css.js +2 -2
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/generated/quetzal-translations.js +1 -2
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/global.d.ts.map +1 -1
- package/dist/esm/in-page-ui/base-styles.d.ts.map +1 -1
- package/dist/esm/in-page-ui/base-styles.js +1 -1
- package/dist/esm/in-page-ui/base-styles.js.map +1 -1
- package/dist/esm/in-page-ui/dom.d.ts.map +1 -1
- package/dist/esm/in-page-ui/dom.js +1 -1
- package/dist/esm/in-page-ui/dom.js.map +1 -1
- package/dist/esm/index.d.ts +25 -25
- package/dist/esm/index.js +2 -4
- package/dist/esm/integrations/convex/component/convex.config.d.ts +1 -3
- package/dist/esm/integrations/convex/component/convex.config.d.ts.map +1 -1
- package/dist/esm/integrations/convex/component/convex.config.js +1 -2
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/esm/integrations/convex.js +1 -2
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js +2 -3
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/auth.test.js +2 -3
- package/dist/esm/lib/auth.test.js.map +1 -1
- package/dist/esm/lib/cookie.d.ts.map +1 -1
- package/dist/esm/lib/cookie.js +4 -22
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.js +1 -2
- package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +35 -43
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +26 -28
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +3 -4
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js +7 -8
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +3 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +13 -13
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js +14 -8
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js +134 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/index.d.ts +3 -3
- package/dist/esm/lib/hexclave-app/apps/index.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts +8 -8
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +6 -6
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts +7 -7
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/common.js +1 -1
- package/dist/esm/lib/hexclave-app/common.js.map +1 -1
- package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/connected-accounts/index.js +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.js +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.js +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/email/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/index.d.ts +14 -14
- package/dist/esm/lib/hexclave-app/index.js +1 -2
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.js +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/notification-categories/index.js +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.js +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/plan-usage/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/plan-usage/index.js +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.js +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.d.ts +2 -2
- package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.js +5 -1
- package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/session-replays/index.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.d.ts +4 -4
- package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.js +2 -3
- package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.test.js +2 -3
- package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/users/index.d.ts +9 -9
- package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/users/index.js +1 -2
- package/dist/esm/lib/hexclave-app/users/index.js.map +1 -1
- package/dist/esm/lib/hooks.d.ts +1 -1
- package/dist/esm/lib/hooks.d.ts.map +1 -1
- package/dist/esm/lib/hooks.js +1 -2
- package/dist/esm/lib/hooks.js.map +1 -1
- package/dist/esm/lib/translations.d.ts.map +1 -1
- package/dist/esm/lib/translations.js +1 -2
- package/dist/esm/lib/translations.js.map +1 -1
- package/dist/esm/providers/hexclave-context.d.ts +1 -1
- package/dist/esm/providers/hexclave-context.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-context.js +1 -3
- package/dist/esm/providers/hexclave-context.js.map +1 -1
- package/dist/esm/providers/hexclave-provider-client.d.ts +2 -3
- package/dist/esm/providers/hexclave-provider-client.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-provider-client.js +2 -4
- package/dist/esm/providers/hexclave-provider-client.js.map +1 -1
- package/dist/esm/providers/hexclave-provider.d.ts +3 -4
- package/dist/esm/providers/hexclave-provider.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-provider.js +2 -3
- package/dist/esm/providers/hexclave-provider.js.map +1 -1
- package/dist/esm/providers/theme-provider.d.ts +1 -2
- package/dist/esm/providers/theme-provider.d.ts.map +1 -1
- package/dist/esm/providers/theme-provider.js +4 -6
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/providers/translation-provider-client.d.ts +1 -2
- package/dist/esm/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/esm/providers/translation-provider-client.js +1 -3
- package/dist/esm/providers/translation-provider-client.js.map +1 -1
- package/dist/esm/providers/translation-provider.d.ts +2 -3
- package/dist/esm/providers/translation-provider.d.ts.map +1 -1
- package/dist/esm/providers/translation-provider.js +1 -2
- package/dist/esm/providers/translation-provider.js.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.d.ts +1 -1
- package/dist/esm/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.js +3 -4
- package/dist/esm/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.test.js +2 -3
- package/dist/esm/pushed-config-error-overlay/index.test.js.map +1 -1
- package/dist/esm/tanstack-start-server-context.d.ts +1 -3
- package/dist/esm/tanstack-start-server-context.d.ts.map +1 -1
- package/dist/esm/utils/browser-script.d.ts +1 -3
- package/dist/esm/utils/browser-script.d.ts.map +1 -1
- package/dist/esm/utils/browser-script.js +1 -2
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/esm/utils/constants.js +1 -1
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/url.d.ts.map +1 -1
- package/dist/esm/utils/url.js +1 -2
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/forgot-password-B7RLLsC2.d.ts +12 -0
- package/dist/forgot-password-B7RLLsC2.d.ts.map +1 -0
- package/dist/generated/env.js +2 -3
- package/dist/generated/env.js.map +1 -1
- package/dist/generated/global-css.d.ts +1 -1
- package/dist/generated/global-css.js +3 -4
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.ts +2 -6
- package/dist/generated/quetzal-translations.js +2 -4
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/hexclave-provider-BdiqjaCz.d.ts +29 -0
- package/dist/hexclave-provider-BdiqjaCz.d.ts.map +1 -0
- package/dist/hooks-psPwqxZ4.d.ts +43 -0
- package/dist/hooks-psPwqxZ4.d.ts.map +1 -0
- package/dist/in-page-ui/base-styles.d.ts.map +1 -1
- package/dist/in-page-ui/base-styles.js +2 -3
- package/dist/in-page-ui/base-styles.js.map +1 -1
- package/dist/in-page-ui/dom.d.ts.map +1 -1
- package/dist/in-page-ui/dom.js +2 -3
- package/dist/in-page-ui/dom.js.map +1 -1
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BSr2pd22.d.ts +14 -0
- package/dist/index-BSr2pd22.d.ts.map +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-Bo5DpPFH.d.ts +17 -0
- package/dist/index-Bo5DpPFH.d.ts.map +1 -0
- package/dist/index-CBDR4cNg.d.ts +206 -0
- package/dist/index-CBDR4cNg.d.ts.map +1 -0
- package/dist/index-C_kxyHao.d.ts +57 -0
- package/dist/{lib/hexclave-app/connected-accounts/index.d.ts.map → index-C_kxyHao.d.ts.map} +1 -1
- package/dist/index-D7Vdg30O.d.ts +27 -0
- package/dist/index-D7Vdg30O.d.ts.map +1 -0
- package/dist/index-DN04TjLM.d.ts +43 -0
- package/dist/index-DN04TjLM.d.ts.map +1 -0
- package/dist/index-DSzMf-rS.d.ts +43 -0
- package/dist/index-DSzMf-rS.d.ts.map +1 -0
- package/dist/index-DbiyXho6.d.ts +129 -0
- package/dist/index-DbiyXho6.d.ts.map +1 -0
- package/dist/index-Dq4xsW7_.d.ts +106 -0
- package/dist/index-Dq4xsW7_.d.ts.map +1 -0
- package/dist/index-O3hJsHSl.d.ts +11 -0
- package/dist/index-O3hJsHSl.d.ts.map +1 -0
- package/dist/index-TUtJOdMm.d.ts +42 -0
- package/dist/index-TUtJOdMm.d.ts.map +1 -0
- package/dist/index-fOYcs4NH.d.ts +53 -0
- package/dist/{lib/hexclave-app/api-keys/index.d.ts.map → index-fOYcs4NH.d.ts.map} +1 -1
- package/dist/index-hYjsGKNc.d.ts +66 -0
- package/dist/index-hYjsGKNc.d.ts.map +1 -0
- package/dist/index-p0N9MbE5.d.ts +147 -0
- package/dist/index-p0N9MbE5.d.ts.map +1 -0
- package/dist/index.d.ts +33 -41
- package/dist/index.js +193 -193
- package/dist/integrations/convex/component/convex.config.d.ts +1 -1
- package/dist/integrations/convex/component/convex.config.d.ts.map +1 -1
- package/dist/integrations/convex/component/convex.config.js +2 -5
- package/dist/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/integrations/convex.d.ts +2 -13
- package/dist/integrations/convex.js +2 -4
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js +3 -5
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/auth.test.js +1 -3
- package/dist/lib/auth.test.js.map +1 -1
- package/dist/lib/cookie.d.ts +2 -42
- package/dist/lib/cookie.js +7 -25
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hexclave-app/api-keys/index.d.ts +2 -53
- package/dist/lib/hexclave-app/api-keys/index.js +2 -4
- package/dist/lib/hexclave-app/api-keys/index.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +2 -449
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +2 -611
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +9 -10
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/common.d.ts +2 -66
- package/dist/lib/hexclave-app/apps/implementations/common.js +10 -11
- package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js +3 -5
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -3
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +2 -35
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +2 -274
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +3 -5
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js +2 -3
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.d.ts +2 -122
- package/dist/lib/hexclave-app/apps/implementations/session-replay.js +15 -10
- package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js +135 -3
- package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/index.d.ts +1 -3
- package/dist/lib/hexclave-app/apps/index.js +32 -34
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +3 -272
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +2 -237
- package/dist/lib/hexclave-app/apps/interfaces/client-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +2 -174
- package/dist/lib/hexclave-app/apps/interfaces/server-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/hexclave-app/common.d.ts +2 -183
- package/dist/lib/hexclave-app/common.js +2 -3
- package/dist/lib/hexclave-app/common.js.map +1 -1
- package/dist/lib/hexclave-app/connected-accounts/index.d.ts +2 -57
- package/dist/lib/hexclave-app/contact-channels/index.d.ts +2 -43
- package/dist/lib/hexclave-app/contact-channels/index.js +2 -3
- package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -1
- package/dist/lib/hexclave-app/customers/index.d.ts +2 -129
- package/dist/lib/hexclave-app/data-vault/index.d.ts +2 -14
- package/dist/lib/hexclave-app/email/index.d.ts +2 -206
- package/dist/lib/hexclave-app/email-templates/index.d.ts +2 -17
- package/dist/lib/hexclave-app/email-templates/index.js +2 -3
- package/dist/lib/hexclave-app/email-templates/index.js.map +1 -1
- package/dist/lib/hexclave-app/index.d.ts +10 -15
- package/dist/lib/hexclave-app/index.js +49 -51
- package/dist/lib/hexclave-app/internal-api-keys/index.d.ts +2 -42
- package/dist/lib/hexclave-app/internal-api-keys/index.js +2 -3
- package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/hexclave-app/notification-categories/index.d.ts +2 -11
- package/dist/lib/hexclave-app/permissions/index.d.ts +2 -43
- package/dist/lib/hexclave-app/permissions/index.js +2 -3
- package/dist/lib/hexclave-app/permissions/index.js.map +1 -1
- package/dist/lib/hexclave-app/plan-usage/index.d.ts +2 -27
- package/dist/lib/hexclave-app/project-configs/index.d.ts +2 -106
- package/dist/lib/hexclave-app/projects/index.d.ts +2 -154
- package/dist/lib/hexclave-app/projects/index.js +6 -3
- package/dist/lib/hexclave-app/projects/index.js.map +1 -1
- package/dist/lib/hexclave-app/session-replays/index.d.ts +2 -66
- package/dist/lib/hexclave-app/teams/index.d.ts +2 -167
- package/dist/lib/hexclave-app/teams/index.js +2 -3
- package/dist/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/lib/hexclave-app/url-targets.d.ts +2 -39
- package/dist/lib/hexclave-app/url-targets.js +3 -5
- package/dist/lib/hexclave-app/url-targets.js.map +1 -1
- package/dist/lib/hexclave-app/url-targets.test.js +1 -3
- package/dist/lib/hexclave-app/url-targets.test.js.map +1 -1
- package/dist/lib/hexclave-app/users/index.d.ts +2 -400
- package/dist/lib/hexclave-app/users/index.js +2 -4
- package/dist/lib/hexclave-app/users/index.js.map +1 -1
- package/dist/lib/hooks.d.ts +2 -45
- package/dist/lib/hooks.js +2 -4
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/translations.d.ts.map +1 -1
- package/dist/lib/translations.js +4 -5
- package/dist/lib/translations.js.map +1 -1
- package/dist/magic-link-callback-DOfNLydt.d.ts +8 -0
- package/dist/magic-link-callback-DOfNLydt.d.ts.map +1 -0
- package/dist/magic-link-sign-in-D5MFDeWQ.d.ts +5 -0
- package/dist/magic-link-sign-in-D5MFDeWQ.d.ts.map +1 -0
- package/dist/message-card-C0AQX5-y.d.ts +18 -0
- package/dist/message-card-C0AQX5-y.d.ts.map +1 -0
- package/dist/mfa-CwYuxAd-.d.ts +9 -0
- package/dist/mfa-CwYuxAd-.d.ts.map +1 -0
- package/dist/oauth-button-PE3z60ay.d.ts +15 -0
- package/dist/oauth-button-PE3z60ay.d.ts.map +1 -0
- package/dist/oauth-button-group-slCOrSxK.d.ts +17 -0
- package/dist/oauth-button-group-slCOrSxK.d.ts.map +1 -0
- package/dist/oauth-callback-tCVTRbF2.d.ts +9 -0
- package/dist/oauth-callback-tCVTRbF2.d.ts.map +1 -0
- package/dist/onboarding-CdpQNCZF.d.ts +7 -0
- package/dist/onboarding-CdpQNCZF.d.ts.map +1 -0
- package/dist/password-reset-CxIuXeIx.d.ts +15 -0
- package/dist/password-reset-CxIuXeIx.d.ts.map +1 -0
- package/dist/providers/hexclave-context.d.ts +1 -1
- package/dist/providers/hexclave-context.d.ts.map +1 -1
- package/dist/providers/hexclave-context.js +5 -8
- package/dist/providers/hexclave-context.js.map +1 -1
- package/dist/providers/hexclave-provider-client.d.ts +2 -3
- package/dist/providers/hexclave-provider-client.d.ts.map +1 -1
- package/dist/providers/hexclave-provider-client.js +4 -6
- package/dist/providers/hexclave-provider-client.js.map +1 -1
- package/dist/providers/hexclave-provider.d.ts +2 -32
- package/dist/providers/hexclave-provider.js +7 -5
- package/dist/providers/hexclave-provider.js.map +1 -1
- package/dist/providers/theme-provider.d.ts +2 -50
- package/dist/providers/theme-provider.js +7 -9
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/providers/translation-provider-client.d.ts +1 -2
- package/dist/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/providers/translation-provider-client.js +5 -8
- package/dist/providers/translation-provider-client.js.map +1 -1
- package/dist/providers/translation-provider.d.ts +2 -16
- package/dist/providers/translation-provider.js +2 -4
- package/dist/providers/translation-provider.js.map +1 -1
- package/dist/pushed-config-error-overlay/index.d.ts +1 -2
- package/dist/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/pushed-config-error-overlay/index.js +4 -6
- package/dist/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/pushed-config-error-overlay/index.test.js +1 -3
- package/dist/pushed-config-error-overlay/index.test.js.map +1 -1
- package/dist/quetzal-translations-XeH3zQ9l.d.ts +6 -0
- package/dist/quetzal-translations-XeH3zQ9l.d.ts.map +1 -0
- package/dist/redirect-page-urls-NUHUchgR.d.ts +35 -0
- package/dist/redirect-page-urls-NUHUchgR.d.ts.map +1 -0
- package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
- package/dist/session-replay-CQ849yH1.d.ts +122 -0
- package/dist/session-replay-CQ849yH1.d.ts.map +1 -0
- package/dist/sign-in-BT45jb_W.d.ts +21 -0
- package/dist/sign-in-BT45jb_W.d.ts.map +1 -0
- package/dist/sign-out-DBnSkfDz.d.ts +8 -0
- package/dist/sign-out-DBnSkfDz.d.ts.map +1 -0
- package/dist/sign-up-BjE_0DB4.d.ts +11 -0
- package/dist/sign-up-BjE_0DB4.d.ts.map +1 -0
- package/dist/{storage-ksajV_p6.d.ts → storage-kputlpQY.d.ts} +1 -1
- package/dist/storage-kputlpQY.d.ts.map +1 -0
- package/dist/tanstack-start-server-context.d.ts +2635 -2
- package/dist/tanstack-start-server-context.d.ts.map +1 -1
- package/dist/team-invitation-B5Ol7vdd.d.ts +11 -0
- package/dist/team-invitation-B5Ol7vdd.d.ts.map +1 -0
- package/dist/theme-provider-D9_ngSbi.d.ts +49 -0
- package/dist/theme-provider-D9_ngSbi.d.ts.map +1 -0
- package/dist/translation-provider-WOaZXqAz.d.ts +15 -0
- package/dist/translation-provider-WOaZXqAz.d.ts.map +1 -0
- package/dist/url-targets-CWO0mjTr.d.ts +39 -0
- package/dist/url-targets-CWO0mjTr.d.ts.map +1 -0
- package/dist/user-avatar-CTyDsibI.d.ts +13 -0
- package/dist/user-avatar-CTyDsibI.d.ts.map +1 -0
- package/dist/user-button-CykqVKoH.d.ts +21 -0
- package/dist/user-button-CykqVKoH.d.ts.map +1 -0
- package/dist/utils/browser-script.d.ts +1 -3
- package/dist/utils/browser-script.d.ts.map +1 -1
- package/dist/utils/browser-script.js +2 -4
- package/dist/utils/browser-script.js.map +1 -1
- package/dist/utils/constants.js +2 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +2 -4
- package/dist/utils/url.js.map +1 -1
- package/package.json +6 -6
- package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +160 -1
- package/src/lib/hexclave-app/apps/implementations/session-replay.ts +38 -12
- package/dist/components/credential-sign-in.d.ts.map +0 -1
- package/dist/components/credential-sign-up.d.ts.map +0 -1
- package/dist/components/elements/user-avatar.d.ts.map +0 -1
- package/dist/components/magic-link-sign-in.d.ts.map +0 -1
- package/dist/components/message-cards/message-card.d.ts.map +0 -1
- package/dist/components/oauth-button-group.d.ts.map +0 -1
- package/dist/components/oauth-button.d.ts.map +0 -1
- package/dist/components/selected-team-switcher.d.ts.map +0 -1
- package/dist/components/team-switcher.d.ts.map +0 -1
- package/dist/components/user-button.d.ts.map +0 -1
- package/dist/components-page/account-settings.d.ts.map +0 -1
- package/dist/components-page/auth-page.d.ts.map +0 -1
- package/dist/components-page/cli-auth-confirm.d.ts.map +0 -1
- package/dist/components-page/email-verification.d.ts.map +0 -1
- package/dist/components-page/error-page.d.ts.map +0 -1
- package/dist/components-page/forgot-password.d.ts.map +0 -1
- package/dist/components-page/hexclave-handler-client.d.ts.map +0 -1
- package/dist/components-page/hexclave-handler.d.ts.map +0 -1
- package/dist/components-page/magic-link-callback.d.ts.map +0 -1
- package/dist/components-page/mfa.d.ts.map +0 -1
- package/dist/components-page/oauth-callback.d.ts.map +0 -1
- package/dist/components-page/onboarding.d.ts.map +0 -1
- package/dist/components-page/password-reset.d.ts.map +0 -1
- package/dist/components-page/sign-in.d.ts.map +0 -1
- package/dist/components-page/sign-out.d.ts.map +0 -1
- package/dist/components-page/sign-up.d.ts.map +0 -1
- package/dist/components-page/team-invitation.d.ts.map +0 -1
- package/dist/generated/quetzal-translations.d.ts.map +0 -1
- package/dist/integrations/convex.d.ts.map +0 -1
- package/dist/lib/cookie.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/common.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/common.d.ts.map +0 -1
- package/dist/lib/hexclave-app/contact-channels/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/customers/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/data-vault/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/email/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/email-templates/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/internal-api-keys/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/notification-categories/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/permissions/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/plan-usage/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/project-configs/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/projects/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/session-replays/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/teams/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/url-targets.d.ts.map +0 -1
- package/dist/lib/hexclave-app/users/index.d.ts.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/providers/hexclave-provider.d.ts.map +0 -1
- package/dist/providers/theme-provider.d.ts.map +0 -1
- package/dist/providers/translation-provider.d.ts.map +0 -1
- package/dist/storage-ksajV_p6.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-refresh-subscription.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\ntype TokenStoreSubscription = {\n unsubscribe: () => void,\n};\n\ntype TokenStoreLike = {\n onChange: (callback: () => void) => TokenStoreSubscription,\n};\n\ntype SessionRefreshLike = {\n sessionKey: string,\n startRefreshingAccessToken: (minMillisUntilExpiration: number, maxMillisSinceIssued: number | null) => TokenStoreSubscription,\n};\n\n/**\n * Keeps the currently mounted React session fresh while `useSyncExternalStore`\n * has an active subscriber. The token store owns which session is current; when\n * it changes to a different session key, we stop refreshing the old session and\n * start refreshing the new one. The caller still receives every token-store\n * change through `onTokenStoreChange` so React can re-read the session snapshot.\n */\nexport function subscribeSessionRefresh(options: {\n tokenStore: TokenStoreLike,\n getSession: () => SessionRefreshLike,\n onTokenStoreChange: () => void,\n minMillisUntilExpiration?: number,\n maxMillisSinceIssued?: number | null,\n}): () => void {\n const minMillisUntilExpiration = options.minMillisUntilExpiration ?? 30_000;\n const maxMillisSinceIssued = options.maxMillisSinceIssued ?? 60_000;\n\n let refreshedSession = options.getSession();\n let refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);\n\n const tokenStoreSubscription = options.tokenStore.onChange(() => {\n const nextSession = options.getSession();\n if (nextSession.sessionKey !== refreshedSession.sessionKey) {\n refreshSubscription.unsubscribe();\n refreshedSession = nextSession;\n refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);\n }\n options.onTokenStoreChange();\n });\n\n return () => {\n tokenStoreSubscription.unsubscribe();\n refreshSubscription.unsubscribe();\n };\n}\n"],"mappings":";;;;;;;;AAwBA,SAAgB,wBAAwB,SAMzB;CACb,MAAM,2BAA2B,QAAQ,4BAA4B;CACrE,MAAM,uBAAuB,QAAQ,wBAAwB;CAE7D,IAAI,mBAAmB,QAAQ,
|
|
1
|
+
{"version":3,"file":"session-refresh-subscription.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\ntype TokenStoreSubscription = {\n unsubscribe: () => void,\n};\n\ntype TokenStoreLike = {\n onChange: (callback: () => void) => TokenStoreSubscription,\n};\n\ntype SessionRefreshLike = {\n sessionKey: string,\n startRefreshingAccessToken: (minMillisUntilExpiration: number, maxMillisSinceIssued: number | null) => TokenStoreSubscription,\n};\n\n/**\n * Keeps the currently mounted React session fresh while `useSyncExternalStore`\n * has an active subscriber. The token store owns which session is current; when\n * it changes to a different session key, we stop refreshing the old session and\n * start refreshing the new one. The caller still receives every token-store\n * change through `onTokenStoreChange` so React can re-read the session snapshot.\n */\nexport function subscribeSessionRefresh(options: {\n tokenStore: TokenStoreLike,\n getSession: () => SessionRefreshLike,\n onTokenStoreChange: () => void,\n minMillisUntilExpiration?: number,\n maxMillisSinceIssued?: number | null,\n}): () => void {\n const minMillisUntilExpiration = options.minMillisUntilExpiration ?? 30_000;\n const maxMillisSinceIssued = options.maxMillisSinceIssued ?? 60_000;\n\n let refreshedSession = options.getSession();\n let refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);\n\n const tokenStoreSubscription = options.tokenStore.onChange(() => {\n const nextSession = options.getSession();\n if (nextSession.sessionKey !== refreshedSession.sessionKey) {\n refreshSubscription.unsubscribe();\n refreshedSession = nextSession;\n refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);\n }\n options.onTokenStoreChange();\n });\n\n return () => {\n tokenStoreSubscription.unsubscribe();\n refreshSubscription.unsubscribe();\n };\n}\n"],"mappings":";;;;;;;;AAwBA,SAAgB,wBAAwB,SAMzB;CACb,MAAM,2BAA2B,QAAQ,4BAA4B;CACrE,MAAM,uBAAuB,QAAQ,wBAAwB;CAE7D,IAAI,mBAAmB,QAAQ,WAAW;CAC1C,IAAI,sBAAsB,iBAAiB,2BAA2B,0BAA0B,oBAAoB;CAEpH,MAAM,yBAAyB,QAAQ,WAAW,eAAe;EAC/D,MAAM,cAAc,QAAQ,WAAW;EACvC,IAAI,YAAY,eAAe,iBAAiB,YAAY;GAC1D,oBAAoB,YAAY;GAChC,mBAAmB;GACnB,sBAAsB,iBAAiB,2BAA2B,0BAA0B,oBAAoB;EAClH;EACA,QAAQ,mBAAmB;CAC7B,CAAC;CAED,aAAa;EACX,uBAAuB,YAAY;EACnC,oBAAoB,YAAY;CAClC;AACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { subscribeSessionRefresh } from "./session-refresh-subscription.js";
|
|
3
|
-
|
|
4
3
|
//#region src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts
|
|
5
4
|
function createTokenStoreTestDouble() {
|
|
6
5
|
const listeners = /* @__PURE__ */ new Set();
|
|
@@ -76,7 +75,7 @@ describe("subscribeSessionRefresh", () => {
|
|
|
76
75
|
expect(secondSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(3e4, 6e4);
|
|
77
76
|
});
|
|
78
77
|
});
|
|
79
|
-
|
|
80
78
|
//#endregion
|
|
81
|
-
export {
|
|
79
|
+
export {};
|
|
80
|
+
|
|
82
81
|
//# sourceMappingURL=session-refresh-subscription.test.js.map
|
package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-refresh-subscription.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it, vi } from \"vitest\";\nimport { subscribeSessionRefresh } from \"./session-refresh-subscription\";\n\ntype Listener = () => void;\n\nfunction createTokenStoreTestDouble() {\n const listeners = new Set<Listener>();\n const unsubscribe = vi.fn((listener: Listener) => {\n listeners.delete(listener);\n });\n\n return {\n tokenStore: {\n onChange: vi.fn((listener: Listener) => {\n listeners.add(listener);\n return {\n unsubscribe: () => unsubscribe(listener),\n };\n }),\n },\n emitChange: () => {\n for (const listener of [...listeners]) {\n listener();\n }\n },\n unsubscribe,\n };\n}\n\nfunction createSessionTestDouble(sessionKey: string) {\n const refreshUnsubscribe = vi.fn();\n return {\n session: {\n sessionKey,\n startRefreshingAccessToken: vi.fn(() => ({\n unsubscribe: refreshUnsubscribe,\n })),\n },\n refreshUnsubscribe,\n };\n}\n\ndescribe(\"subscribeSessionRefresh\", () => {\n it(\"starts token refresh while subscribed and stops it on unsubscribe\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const onTokenStoreChange = vi.fn();\n\n const unsubscribe = subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => firstSession.session,\n onTokenStoreChange,\n });\n\n expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);\n expect(tokenStore.tokenStore.onChange).toHaveBeenCalledOnce();\n\n unsubscribe();\n\n expect(tokenStore.unsubscribe).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();\n });\n\n it(\"keeps the existing refresh loop when the token store changes within the same session\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const onTokenStoreChange = vi.fn();\n\n subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => firstSession.session,\n onTokenStoreChange,\n });\n\n tokenStore.emitChange();\n\n expect(onTokenStoreChange).toHaveBeenCalledOnce();\n expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).not.toHaveBeenCalled();\n });\n\n it(\"moves the refresh loop when the token store changes to a different session\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const secondSession = createSessionTestDouble(\"refresh-token-2\");\n const sessions = [firstSession.session, secondSession.session];\n const onTokenStoreChange = vi.fn();\n\n subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => sessions[0] ?? secondSession.session,\n onTokenStoreChange,\n });\n\n sessions.shift();\n tokenStore.emitChange();\n\n expect(onTokenStoreChange).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();\n expect(secondSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-refresh-subscription.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it, vi } from \"vitest\";\nimport { subscribeSessionRefresh } from \"./session-refresh-subscription\";\n\ntype Listener = () => void;\n\nfunction createTokenStoreTestDouble() {\n const listeners = new Set<Listener>();\n const unsubscribe = vi.fn((listener: Listener) => {\n listeners.delete(listener);\n });\n\n return {\n tokenStore: {\n onChange: vi.fn((listener: Listener) => {\n listeners.add(listener);\n return {\n unsubscribe: () => unsubscribe(listener),\n };\n }),\n },\n emitChange: () => {\n for (const listener of [...listeners]) {\n listener();\n }\n },\n unsubscribe,\n };\n}\n\nfunction createSessionTestDouble(sessionKey: string) {\n const refreshUnsubscribe = vi.fn();\n return {\n session: {\n sessionKey,\n startRefreshingAccessToken: vi.fn(() => ({\n unsubscribe: refreshUnsubscribe,\n })),\n },\n refreshUnsubscribe,\n };\n}\n\ndescribe(\"subscribeSessionRefresh\", () => {\n it(\"starts token refresh while subscribed and stops it on unsubscribe\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const onTokenStoreChange = vi.fn();\n\n const unsubscribe = subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => firstSession.session,\n onTokenStoreChange,\n });\n\n expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);\n expect(tokenStore.tokenStore.onChange).toHaveBeenCalledOnce();\n\n unsubscribe();\n\n expect(tokenStore.unsubscribe).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();\n });\n\n it(\"keeps the existing refresh loop when the token store changes within the same session\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const onTokenStoreChange = vi.fn();\n\n subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => firstSession.session,\n onTokenStoreChange,\n });\n\n tokenStore.emitChange();\n\n expect(onTokenStoreChange).toHaveBeenCalledOnce();\n expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).not.toHaveBeenCalled();\n });\n\n it(\"moves the refresh loop when the token store changes to a different session\", () => {\n const tokenStore = createTokenStoreTestDouble();\n const firstSession = createSessionTestDouble(\"refresh-token-1\");\n const secondSession = createSessionTestDouble(\"refresh-token-2\");\n const sessions = [firstSession.session, secondSession.session];\n const onTokenStoreChange = vi.fn();\n\n subscribeSessionRefresh({\n tokenStore: tokenStore.tokenStore,\n getSession: () => sessions[0] ?? secondSession.session,\n onTokenStoreChange,\n });\n\n sessions.shift();\n tokenStore.emitChange();\n\n expect(onTokenStoreChange).toHaveBeenCalledOnce();\n expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();\n expect(secondSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);\n });\n});\n"],"mappings":";;;AASA,SAAS,6BAA6B;CACpC,MAAM,4BAAY,IAAI,IAAc;CACpC,MAAM,cAAc,GAAG,IAAI,aAAuB;EAChD,UAAU,OAAO,QAAQ;CAC3B,CAAC;CAED,OAAO;EACL,YAAY,EACV,UAAU,GAAG,IAAI,aAAuB;GACtC,UAAU,IAAI,QAAQ;GACtB,OAAO,EACL,mBAAmB,YAAY,QAAQ,EACzC;EACF,CAAC,EACH;EACA,kBAAkB;GAChB,KAAK,MAAM,YAAY,CAAC,GAAG,SAAS,GAClC,SAAS;EAEb;EACA;CACF;AACF;AAEA,SAAS,wBAAwB,YAAoB;CACnD,MAAM,qBAAqB,GAAG,GAAG;CACjC,OAAO;EACL,SAAS;GACP;GACA,4BAA4B,GAAG,UAAU,EACvC,aAAa,mBACf,EAAE;EACJ;EACA;CACF;AACF;AAEA,SAAS,iCAAiC;CACxC,GAAG,2EAA2E;EAC5E,MAAM,aAAa,2BAA2B;EAC9C,MAAM,eAAe,wBAAwB,iBAAiB;EAC9D,MAAM,qBAAqB,GAAG,GAAG;EAEjC,MAAM,cAAc,wBAAwB;GAC1C,YAAY,WAAW;GACvB,kBAAkB,aAAa;GAC/B;EACF,CAAC;EAED,OAAO,aAAa,QAAQ,0BAA0B,CAAC,CAAC,qBAAqB,KAAQ,GAAM;EAC3F,OAAO,WAAW,WAAW,QAAQ,CAAC,CAAC,qBAAqB;EAE5D,YAAY;EAEZ,OAAO,WAAW,WAAW,CAAC,CAAC,qBAAqB;EACpD,OAAO,aAAa,kBAAkB,CAAC,CAAC,qBAAqB;CAC/D,CAAC;CAED,GAAG,8FAA8F;EAC/F,MAAM,aAAa,2BAA2B;EAC9C,MAAM,eAAe,wBAAwB,iBAAiB;EAC9D,MAAM,qBAAqB,GAAG,GAAG;EAEjC,wBAAwB;GACtB,YAAY,WAAW;GACvB,kBAAkB,aAAa;GAC/B;EACF,CAAC;EAED,WAAW,WAAW;EAEtB,OAAO,kBAAkB,CAAC,CAAC,qBAAqB;EAChD,OAAO,aAAa,QAAQ,0BAA0B,CAAC,CAAC,qBAAqB;EAC7E,OAAO,aAAa,kBAAkB,CAAC,CAAC,IAAI,iBAAiB;CAC/D,CAAC;CAED,GAAG,oFAAoF;EACrF,MAAM,aAAa,2BAA2B;EAC9C,MAAM,eAAe,wBAAwB,iBAAiB;EAC9D,MAAM,gBAAgB,wBAAwB,iBAAiB;EAC/D,MAAM,WAAW,CAAC,aAAa,SAAS,cAAc,OAAO;EAC7D,MAAM,qBAAqB,GAAG,GAAG;EAEjC,wBAAwB;GACtB,YAAY,WAAW;GACvB,kBAAkB,SAAS,MAAM,cAAc;GAC/C;EACF,CAAC;EAED,SAAS,MAAM;EACf,WAAW,WAAW;EAEtB,OAAO,kBAAkB,CAAC,CAAC,qBAAqB;EAChD,OAAO,aAAa,kBAAkB,CAAC,CAAC,qBAAqB;EAC7D,OAAO,cAAc,QAAQ,0BAA0B,CAAC,CAAC,qBAAqB,KAAQ,GAAM;CAC9F,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.ts"],"mappings":";;;KAUY,sBAAA;;AAAZ;;;;EAME,OAAA;EAMA;;;;;EAAA,aAAA;EAiBU;;;;;;EAVV,UAAA,YAAsB,
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.ts"],"mappings":";;;KAUY,sBAAA;;AAAZ;;;;EAME,OAAA;EAMA;;;;;EAAA,aAAA;EAiBU;;;;;;EAVV,UAAA,YAAsB,MAAM;EAqBI;AAAA;AAGlC;;;;EAjBE,aAAA;AAAA;AAAA,KAGU,gBAAA;EAcmG;AAAA;AAa/G;;;EArBE,OAAA;EAqB8C;;;;EAhB9C,OAAA,GAAU,sBAAsB;AAAA;AAAA,iBAGlB,uBAAA,CAAwB,gBAAA,EAAkB,gBAAA,eAA+B,sBAAsB;;;;;;;iBAa/F,sBAAA,CAAuB,OAAA,EAAS,gBAAA,eAA+B,gBAAgB;AA4D/F;;;;AAAA,iBA1CgB,wBAAA,CAAyB,IAAA,EAAM,gBAAA,eAA+B,gBAAgB;AAAA,KA0ClF,aAAA;EACV,UAAA;EACA,aAAA;EACA,gBAAA;AAAA;AAAA,iBAGc,sBAAA,CAAuB,GAAA,kBAAqB,aAAa;AAAA,iBAczD,cAAA,CAAe,SAAiB;AAAA,iBAKhC,oBAAA,CAAqB,SAAiB;AAAA,iBAItC,YAAA;AAAA,iBAIA,kBAAA,CAAmB,OAAA;EAAW,GAAA;EAAa,SAAA;EAAoB,KAAA;AAAA,IAAkB,aAAa;AAAA,KAiBlG,mBAAA;EACV,SAAA;EACA,SAAA,GAAY,IAAA,UAAc,OAAA;IAAW,SAAA;EAAA,MAAyB,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAU,KAAA;AAAA;AAAA,iBAGzE,0BAAA,CAA2B,KAAc;;;AA1B7B;AAI5B;;iBA+BgB,uBAAA,CAAwB,KAAc;AAAA,cAUzC,eAAA;EAAA,QACH,QAAA;EAAA,QACA,UAAA;EAAA,QACA,SAAA;EAAA,QACA,cAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;EAAA,QACA,oBAAA;EAAA,QACA,UAAA;EAAA,QACA,YAAA;EAAA,QACA,qBAAA;EAAA,QACA,eAAA;EAAA,QACA,gBAAA;EAAA,iBACS,uBAAA;EAAA,iBACA,WAAA;EAAA,iBAEA,iBAAA;EAAA,iBACA,KAAA;EAAA,iBACA,cAAA;cAEL,IAAA,EAAM,mBAAA,EAAqB,aAAA,EAAe,sBAAsB;EA7Cd;;;EAwD9D,KAAA;EAYA,IAAA;EAWA,WAAA;EAAA,QAMQ,gBAAA;EAAA,QASM,MAAA;EAAA,QA+GN,QAAA;EAAA,QAUM,eAAA;EAAA,QAgEN,qBAAA;EAAA,QAeA,KAAA;AAAA"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
|
|
2
1
|
import { captureWarning, throwErr } from "@hexclave/shared/dist/utils/errors";
|
|
2
|
+
import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
|
|
3
3
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
4
4
|
import { isBrowserLike } from "@hexclave/shared/dist/utils/env";
|
|
5
5
|
import { KnownErrors } from "@hexclave/shared/dist/known-errors";
|
|
6
|
-
|
|
7
6
|
//#region src/lib/hexclave-app/apps/implementations/session-replay.ts
|
|
8
7
|
function getSessionReplayOptions(analyticsOptions) {
|
|
9
8
|
return {
|
|
@@ -57,7 +56,8 @@ const IDLE_TTL_MS = 180 * 1e3;
|
|
|
57
56
|
const FLUSH_INTERVAL_MS = 5e3;
|
|
58
57
|
const MAX_EVENTS_PER_BATCH = 200;
|
|
59
58
|
const MAX_APPROX_BYTES_PER_BATCH = 512e3;
|
|
60
|
-
const
|
|
59
|
+
const MAX_BATCH_UNCOMPRESSED_BYTES = 9e5;
|
|
60
|
+
const MAX_SINGLE_EVENT_BYTES = 8 * 1024 * 1024 - 1024;
|
|
61
61
|
const textEncoder = new TextEncoder();
|
|
62
62
|
function safeParseStoredSession(raw) {
|
|
63
63
|
if (!raw) return null;
|
|
@@ -181,13 +181,14 @@ var SessionRecorder = class {
|
|
|
181
181
|
this._events = [];
|
|
182
182
|
this._eventSizes = [];
|
|
183
183
|
this._approxBytes = 0;
|
|
184
|
+
const maxSingleEventBytes = options.keepalive ? MAX_BATCH_UNCOMPRESSED_BYTES : MAX_SINGLE_EVENT_BYTES;
|
|
184
185
|
this._flushInProgress = true;
|
|
185
186
|
try {
|
|
186
187
|
let offset = 0;
|
|
187
188
|
while (offset < allEvents.length) {
|
|
188
189
|
const firstSize = allSizes[offset] ?? throwErr("_eventSizes out of sync with _events — this should never happen");
|
|
189
|
-
if (firstSize >
|
|
190
|
-
captureWarning("SessionRecorder.flush", /* @__PURE__ */ new Error(`Dropping oversized session replay event (${firstSize} bytes > ${
|
|
190
|
+
if (firstSize > maxSingleEventBytes) {
|
|
191
|
+
captureWarning("SessionRecorder.flush", /* @__PURE__ */ new Error(`Dropping oversized session replay event (${firstSize} bytes > ${maxSingleEventBytes} byte limit); it cannot be sent without exceeding the server's body limit.`));
|
|
191
192
|
offset += 1;
|
|
192
193
|
continue;
|
|
193
194
|
}
|
|
@@ -195,7 +196,7 @@ var SessionRecorder = class {
|
|
|
195
196
|
let batchEnd = offset;
|
|
196
197
|
for (let i = offset; i < allEvents.length; i++) {
|
|
197
198
|
const nextSize = allSizes[i] ?? throwErr("_eventSizes out of sync with _events — this should never happen");
|
|
198
|
-
if (batchBytes + nextSize >
|
|
199
|
+
if (batchBytes + nextSize > MAX_BATCH_UNCOMPRESSED_BYTES && batchEnd > offset) break;
|
|
199
200
|
batchBytes += nextSize;
|
|
200
201
|
batchEnd = i + 1;
|
|
201
202
|
}
|
|
@@ -221,7 +222,12 @@ var SessionRecorder = class {
|
|
|
221
222
|
return;
|
|
222
223
|
}
|
|
223
224
|
if (!res.data.ok) {
|
|
224
|
-
|
|
225
|
+
const droppedCount = batchEvents.length + (allEvents.length - offset);
|
|
226
|
+
if (res.data.status === 413) {
|
|
227
|
+
captureWarning("SessionRecorder.flush", /* @__PURE__ */ new Error(`Session replay batch rejected with 413 (payload too large) despite client-side size caps; dropping ${droppedCount} buffered event(s). A poorly-compressible event likely exceeded the server's body limit after gzip.`));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
captureWarning("SessionRecorder.flush", /* @__PURE__ */ new Error(`SessionRecorder flush failed (dropping ${droppedCount} buffered event(s)): ${res.data.status} ${await res.data.text()}`));
|
|
225
231
|
return;
|
|
226
232
|
}
|
|
227
233
|
}
|
|
@@ -303,7 +309,7 @@ var SessionRecorder = class {
|
|
|
303
309
|
if (this._events.length > 0) runAsynchronously(() => this._flush({ keepalive: false }));
|
|
304
310
|
}
|
|
305
311
|
};
|
|
306
|
-
|
|
307
312
|
//#endregion
|
|
308
313
|
export { SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson, generateUuid, getOrRotateSession, getSessionReplayOptions, isAdBlockerNetworkError, isAnalyticsNotEnabledError, makeLegacyStorageKey, makeStorageKey, safeParseStoredSession };
|
|
314
|
+
|
|
309
315
|
//# sourceMappingURL=session-replay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { captureWarning, throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\n\nexport type AnalyticsReplayOptions = {\n /**\n * Whether session replays are enabled.\n *\n * @default true\n */\n enabled?: boolean,\n /**\n * Whether to mask the content of all `<input>` elements.\n *\n * @default true\n */\n maskAllInputs?: boolean,\n /**\n * A CSS class name or RegExp. Elements with a matching class will be blocked\n * (replaced with a placeholder in the recording).\n *\n * @default undefined\n */\n blockClass?: string | RegExp,\n /**\n * A CSS selector string. Elements matching this selector will be blocked\n * (replaced with a placeholder in the recording).\n *\n * @default undefined\n */\n blockSelector?: string,\n};\n\nexport type AnalyticsOptions = {\n /**\n * Whether SDK-managed analytics capture is enabled.\n *\n * @default true\n */\n enabled?: boolean,\n /**\n * Options for session replay recording. Replays are enabled by default;\n * set `enabled: false` to opt out.\n */\n replays?: AnalyticsReplayOptions,\n};\n\nexport function getSessionReplayOptions(analyticsOptions: AnalyticsOptions | undefined): AnalyticsReplayOptions {\n return {\n ...analyticsOptions?.replays,\n enabled: analyticsOptions?.replays?.enabled ?? true,\n };\n}\n\n/**\n * Converts AnalyticsOptions to a JSON-safe representation.\n * RegExp blockClass values are serialized as `{ __regexp, __flags }` objects.\n * The return type is AnalyticsOptions to keep StackClientAppJson simple;\n * the actual runtime value is JSON-safe.\n */\nexport function analyticsOptionsToJson(options: AnalyticsOptions | undefined): AnalyticsOptions | undefined {\n if (!options?.replays?.blockClass) return options;\n const { blockClass, ...rest } = options.replays;\n if (!(blockClass instanceof RegExp)) return options;\n return {\n ...options,\n replays: {\n ...rest,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n blockClass: { __regexp: blockClass.source, __flags: blockClass.flags } as any,\n },\n };\n}\n\n/**\n * Reconstructs AnalyticsOptions from a JSON-deserialized value.\n * Converts `{ __regexp, __flags }` objects back to RegExp instances.\n */\nexport function analyticsOptionsFromJson(json: AnalyticsOptions | undefined): AnalyticsOptions | undefined {\n if (!json?.replays?.blockClass) return json;\n const { blockClass, ...rest } = json.replays;\n if (typeof blockClass === 'object' && '__regexp' in blockClass) {\n const bc = blockClass as unknown as { __regexp: string, __flags: string };\n return {\n ...json,\n replays: {\n ...rest,\n blockClass: new RegExp(bc.__regexp, bc.__flags),\n },\n };\n }\n return json;\n}\n\n// ---------- Recording internals ----------\n\n// Hexclave rebrand: canonical localStorage prefix (colon delimiters preserved).\nconst LOCAL_STORAGE_PREFIX = \"hexclave:session-replay:v1\";\n// Hexclave rebrand: legacy prefix — dual-read only, so a recording session active\n// across an SDK upgrade is not orphaned. Never written.\nconst LEGACY_LOCAL_STORAGE_PREFIX = \"stack:session-replay:v1\";\nconst IDLE_TTL_MS = 3 * 60 * 1000;\n\nconst FLUSH_INTERVAL_MS = 5_000;\nconst MAX_EVENTS_PER_BATCH = 200;\nconst MAX_APPROX_BYTES_PER_BATCH = 512_000;\n// The server rejects payloads > 1MB. Stay well under to account for JSON\n// envelope overhead (browser_session_id, timestamps, wrapper keys, etc.).\nconst MAX_FLUSH_PAYLOAD_BYTES = 900_000;\n\n// Reused across the emit hot path to avoid per-event allocation.\nconst textEncoder = new TextEncoder();\n\nexport type StoredSession = {\n session_id: string,\n created_at_ms: number,\n last_activity_ms: number,\n};\n\nexport function safeParseStoredSession(raw: string | null): StoredSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n if (typeof parsed.session_id !== \"string\") return null;\n if (typeof parsed.created_at_ms !== \"number\") return null;\n if (typeof parsed.last_activity_ms !== \"number\") return null;\n return parsed as StoredSession;\n } catch {\n return null;\n }\n}\n\nexport function makeStorageKey(projectId: string) {\n return `${LOCAL_STORAGE_PREFIX}:${projectId}`;\n}\n\n// Hexclave rebrand: legacy key, dual-read only (never written).\nexport function makeLegacyStorageKey(projectId: string) {\n return `${LEGACY_LOCAL_STORAGE_PREFIX}:${projectId}`;\n}\n\nexport function generateUuid() {\n return crypto.randomUUID();\n}\n\nexport function getOrRotateSession(options: { key: string, legacyKey?: string, nowMs: number }): StoredSession {\n // Hexclave rebrand: prefer the new key; fall back to the legacy key so a\n // recording session active across an SDK upgrade is not orphaned.\n const existing = safeParseStoredSession(localStorage.getItem(options.key))\n ?? (options.legacyKey ? safeParseStoredSession(localStorage.getItem(options.legacyKey)) : null);\n if (existing && options.nowMs - existing.last_activity_ms <= IDLE_TTL_MS) {\n return existing;\n }\n const next: StoredSession = {\n session_id: generateUuid(),\n created_at_ms: options.nowMs,\n last_activity_ms: options.nowMs,\n };\n localStorage.setItem(options.key, JSON.stringify(next));\n return next;\n}\n\nexport type SessionRecorderDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\nexport function isAnalyticsNotEnabledError(error: unknown): boolean {\n return KnownErrors.AnalyticsNotEnabled.isInstance(error);\n}\n\n/**\n * Whether the error looks like a network failure caused by an ad blocker or\n * similar extension blocking analytics requests. These are expected in\n * production and should be silently ignored rather than logged as warnings.\n */\nexport function isAdBlockerNetworkError(error: unknown): boolean {\n if (error instanceof Error) {\n return error.message.includes(\"Failed to fetch\")\n || error.message.includes(\"NetworkError\")\n || error.message.includes(\"Load failed\")\n || error.message.includes(\"network connection\");\n }\n return false;\n}\n\nexport class SessionRecorder {\n private _started = false;\n private _cancelled = false;\n private _disabled = false;\n private _stopRecording: (() => void) | null = null;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: unknown[] = [];\n private _eventSizes: number[] = [];\n private _approxBytes = 0;\n private _lastPersistActivity = 0;\n private _recording = false;\n private _rrwebModule: typeof import(\"rrweb\") | null = null;\n private _lastBrowserSessionId: string | null = null;\n private _takingSnapshot = false;\n private _flushInProgress = false;\n private readonly _sessionReplaySegmentId: string;\n private readonly _storageKey: string;\n // Hexclave rebrand: legacy key used for dual-read fallback only.\n private readonly _legacyStorageKey: string;\n private readonly _deps: SessionRecorderDeps;\n private readonly _replayOptions: AnalyticsReplayOptions;\n\n constructor(deps: SessionRecorderDeps, replayOptions: AnalyticsReplayOptions) {\n this._deps = deps;\n this._replayOptions = replayOptions;\n this._sessionReplaySegmentId = generateUuid();\n this._storageKey = makeStorageKey(deps.projectId);\n this._legacyStorageKey = makeLegacyStorageKey(deps.projectId);\n }\n\n /**\n * Starts recording. Idempotent — calling multiple times is safe.\n */\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n this._started = true;\n\n // Kick off rrweb recording\n runAsynchronously(() => this._startRecording(), { noErrorLogging: true });\n\n // Periodic flush\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n // Flush remaining events before cleanup\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._stopCurrentRecording();\n }\n\n clearBuffer() {\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n }\n\n private _persistActivity(nowMs: number): StoredSession {\n const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });\n if (nowMs - this._lastPersistActivity < 5_000) return stored;\n this._lastPersistActivity = nowMs;\n const updated: StoredSession = { ...stored, last_activity_ms: nowMs };\n localStorage.setItem(this._storageKey, JSON.stringify(updated));\n return stored;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._disabled) return;\n if (this._events.length === 0) return;\n // Prevent concurrent in-flight HTTP requests. When a flush is already\n // in-flight, a second batch could race on the server (both call\n // findRecentSessionReplay before either upsert commits) and create\n // duplicate SessionReplay records. Events stay in _events and will be\n // picked up by the next tick or batch-size check.\n if (this._flushInProgress) return;\n\n const nowMs = Date.now();\n const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });\n\n // Capture all buffered events upfront (before any await) so that\n // stop() / _stopCurrentRecording() clearing this._events cannot race\n // with the async send loop below and silently discard overflow batches.\n const allEvents = this._events;\n const allSizes = this._eventSizes;\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n\n this._flushInProgress = true;\n try {\n let offset = 0;\n while (offset < allEvents.length) {\n // Build a batch that fits under the server's payload limit.\n // When _flushInProgress blocked earlier flushes, events can accumulate\n // well past MAX_APPROX_BYTES_PER_BATCH; sending them all at once would\n // exceed the server's 1MB body limit (413).\n // A single event over the limit can't be sent (rrweb events aren't splittable); drop it and move on.\n const firstSize = allSizes[offset] ?? throwErr(\"_eventSizes out of sync with _events — this should never happen\");\n if (firstSize > MAX_FLUSH_PAYLOAD_BYTES) {\n captureWarning(\n \"SessionRecorder.flush\",\n new Error(`Dropping oversized session replay event (${firstSize} bytes > ${MAX_FLUSH_PAYLOAD_BYTES} byte limit); it cannot be sent without a 413.`),\n );\n offset += 1;\n continue;\n }\n\n let batchBytes = 0;\n let batchEnd = offset;\n for (let i = offset; i < allEvents.length; i++) {\n const nextSize = allSizes[i] ?? throwErr(\"_eventSizes out of sync with _events — this should never happen\");\n if (batchBytes + nextSize > MAX_FLUSH_PAYLOAD_BYTES && batchEnd > offset) break;\n batchBytes += nextSize;\n batchEnd = i + 1;\n }\n\n const batchEvents = allEvents.slice(offset, batchEnd);\n offset = batchEnd;\n\n const batchId = generateUuid();\n const payload = {\n browser_session_id: stored.session_id,\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n started_at_ms: stored.created_at_ms,\n sent_at_ms: nowMs,\n events: batchEvents,\n };\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n if (isAnalyticsNotEnabledError(res.error)) {\n this._disable();\n return;\n }\n // Ad blockers commonly block analytics endpoints, causing network\n // errors. These are expected and should not pollute the console.\n if (isAdBlockerNetworkError(res.error)) {\n return;\n }\n captureWarning(\"SessionRecorder.flush\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n captureWarning(\"SessionRecorder.flush\", new Error(`SessionRecorder flush failed: ${res.data.status} ${await res.data.text()}`));\n return;\n }\n }\n } finally {\n this._flushInProgress = false;\n }\n }\n\n private _disable() {\n this._disabled = true;\n this.clearBuffer();\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n this._stopCurrentRecording();\n }\n\n private async _startRecording() {\n if (this._recording || this._cancelled) return;\n\n if (!this._rrwebModule) {\n const rrwebImport = await Result.fromPromise(import(\"rrweb\"));\n if (rrwebImport.status === \"error\") {\n console.warn(\"SessionRecorder: rrweb import failed. Is rrweb installed?\", rrwebImport.error);\n return;\n }\n this._rrwebModule = rrwebImport.data;\n }\n\n // cancelled may change during the await above\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this._cancelled) return;\n\n this._stopRecording = this._rrwebModule.record({\n emit: (event) => {\n const nowMs = Date.now();\n const stored = this._persistActivity(nowMs);\n\n // Detect session rotation: after 3+ minutes idle, getOrRotateSession\n // creates a new session ID. We need to inject a FullSnapshot so the\n // new server-side SessionReplay record is playable.\n if (this._lastBrowserSessionId === null) {\n this._lastBrowserSessionId = stored.session_id;\n } else if (stored.session_id !== this._lastBrowserSessionId && !this._takingSnapshot) {\n this._lastBrowserSessionId = stored.session_id;\n // Inject a FullSnapshot for the new session (calls emit synchronously)\n this._takingSnapshot = true;\n try {\n this._rrwebModule!.record.takeFullSnapshot();\n } finally {\n this._takingSnapshot = false;\n }\n }\n\n // Measure UTF-8 byte length to match the server's byte limit (.length counts UTF-16 units, undercounting multibyte content).\n const eventSize = textEncoder.encode(JSON.stringify(event)).byteLength;\n this._events.push(event);\n this._eventSizes.push(eventSize);\n this._approxBytes += eventSize;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n },\n maskAllInputs: this._replayOptions.maskAllInputs ?? true,\n ...(this._replayOptions.blockClass !== undefined ? { blockClass: this._replayOptions.blockClass } : {}),\n ...(this._replayOptions.blockSelector !== undefined ? { blockSelector: this._replayOptions.blockSelector } : {}),\n }) ?? null;\n\n this._recording = true;\n\n const onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n window.addEventListener(\"pagehide\", onPageHide);\n document.addEventListener(\"visibilitychange\", onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", onPageHide);\n document.removeEventListener(\"visibilitychange\", onPageHide);\n };\n }\n\n private _stopCurrentRecording() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n if (this._stopRecording) {\n this._stopRecording();\n this._stopRecording = null;\n }\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n this._recording = false;\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-replay.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { captureWarning, throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\n\nexport type AnalyticsReplayOptions = {\n /**\n * Whether session replays are enabled.\n *\n * @default true\n */\n enabled?: boolean,\n /**\n * Whether to mask the content of all `<input>` elements.\n *\n * @default true\n */\n maskAllInputs?: boolean,\n /**\n * A CSS class name or RegExp. Elements with a matching class will be blocked\n * (replaced with a placeholder in the recording).\n *\n * @default undefined\n */\n blockClass?: string | RegExp,\n /**\n * A CSS selector string. Elements matching this selector will be blocked\n * (replaced with a placeholder in the recording).\n *\n * @default undefined\n */\n blockSelector?: string,\n};\n\nexport type AnalyticsOptions = {\n /**\n * Whether SDK-managed analytics capture is enabled.\n *\n * @default true\n */\n enabled?: boolean,\n /**\n * Options for session replay recording. Replays are enabled by default;\n * set `enabled: false` to opt out.\n */\n replays?: AnalyticsReplayOptions,\n};\n\nexport function getSessionReplayOptions(analyticsOptions: AnalyticsOptions | undefined): AnalyticsReplayOptions {\n return {\n ...analyticsOptions?.replays,\n enabled: analyticsOptions?.replays?.enabled ?? true,\n };\n}\n\n/**\n * Converts AnalyticsOptions to a JSON-safe representation.\n * RegExp blockClass values are serialized as `{ __regexp, __flags }` objects.\n * The return type is AnalyticsOptions to keep StackClientAppJson simple;\n * the actual runtime value is JSON-safe.\n */\nexport function analyticsOptionsToJson(options: AnalyticsOptions | undefined): AnalyticsOptions | undefined {\n if (!options?.replays?.blockClass) return options;\n const { blockClass, ...rest } = options.replays;\n if (!(blockClass instanceof RegExp)) return options;\n return {\n ...options,\n replays: {\n ...rest,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n blockClass: { __regexp: blockClass.source, __flags: blockClass.flags } as any,\n },\n };\n}\n\n/**\n * Reconstructs AnalyticsOptions from a JSON-deserialized value.\n * Converts `{ __regexp, __flags }` objects back to RegExp instances.\n */\nexport function analyticsOptionsFromJson(json: AnalyticsOptions | undefined): AnalyticsOptions | undefined {\n if (!json?.replays?.blockClass) return json;\n const { blockClass, ...rest } = json.replays;\n if (typeof blockClass === 'object' && '__regexp' in blockClass) {\n const bc = blockClass as unknown as { __regexp: string, __flags: string };\n return {\n ...json,\n replays: {\n ...rest,\n blockClass: new RegExp(bc.__regexp, bc.__flags),\n },\n };\n }\n return json;\n}\n\n// ---------- Recording internals ----------\n\n// Hexclave rebrand: canonical localStorage prefix (colon delimiters preserved).\nconst LOCAL_STORAGE_PREFIX = \"hexclave:session-replay:v1\";\n// Hexclave rebrand: legacy prefix — dual-read only, so a recording session active\n// across an SDK upgrade is not orphaned. Never written.\nconst LEGACY_LOCAL_STORAGE_PREFIX = \"stack:session-replay:v1\";\nconst IDLE_TTL_MS = 3 * 60 * 1000;\n\nconst FLUSH_INTERVAL_MS = 5_000;\nconst MAX_EVENTS_PER_BATCH = 200;\nconst MAX_APPROX_BYTES_PER_BATCH = 512_000;\n// Uncompressed per-batch target; the transport gzips before sending.\nconst MAX_BATCH_UNCOMPRESSED_BYTES = 900_000;\n// The server gunzips the whole batch (envelope + events) and rejects anything\n// whose decompressed size exceeds MAX_DECOMPRESSED_BYTES (8 MiB) in the backend\n// route. Since a single oversized event is sent alone, reserve headroom for the\n// JSON envelope (session/batch ids, timestamps, wrapper keys) so an event that\n// passes this check can't render a batch that trips the server's cap by a few\n// hundred bytes. Keep the server's MAX_DECOMPRESSED_BYTES >= this + the margin.\nconst BATCH_ENVELOPE_OVERHEAD_BYTES = 1024;\nconst MAX_SINGLE_EVENT_BYTES = 8 * 1024 * 1024 - BATCH_ENVELOPE_OVERHEAD_BYTES;\n\n// Reused across the emit hot path to avoid per-event allocation.\nconst textEncoder = new TextEncoder();\n\nexport type StoredSession = {\n session_id: string,\n created_at_ms: number,\n last_activity_ms: number,\n};\n\nexport function safeParseStoredSession(raw: string | null): StoredSession | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n if (typeof parsed.session_id !== \"string\") return null;\n if (typeof parsed.created_at_ms !== \"number\") return null;\n if (typeof parsed.last_activity_ms !== \"number\") return null;\n return parsed as StoredSession;\n } catch {\n return null;\n }\n}\n\nexport function makeStorageKey(projectId: string) {\n return `${LOCAL_STORAGE_PREFIX}:${projectId}`;\n}\n\n// Hexclave rebrand: legacy key, dual-read only (never written).\nexport function makeLegacyStorageKey(projectId: string) {\n return `${LEGACY_LOCAL_STORAGE_PREFIX}:${projectId}`;\n}\n\nexport function generateUuid() {\n return crypto.randomUUID();\n}\n\nexport function getOrRotateSession(options: { key: string, legacyKey?: string, nowMs: number }): StoredSession {\n // Hexclave rebrand: prefer the new key; fall back to the legacy key so a\n // recording session active across an SDK upgrade is not orphaned.\n const existing = safeParseStoredSession(localStorage.getItem(options.key))\n ?? (options.legacyKey ? safeParseStoredSession(localStorage.getItem(options.legacyKey)) : null);\n if (existing && options.nowMs - existing.last_activity_ms <= IDLE_TTL_MS) {\n return existing;\n }\n const next: StoredSession = {\n session_id: generateUuid(),\n created_at_ms: options.nowMs,\n last_activity_ms: options.nowMs,\n };\n localStorage.setItem(options.key, JSON.stringify(next));\n return next;\n}\n\nexport type SessionRecorderDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\nexport function isAnalyticsNotEnabledError(error: unknown): boolean {\n return KnownErrors.AnalyticsNotEnabled.isInstance(error);\n}\n\n/**\n * Whether the error looks like a network failure caused by an ad blocker or\n * similar extension blocking analytics requests. These are expected in\n * production and should be silently ignored rather than logged as warnings.\n */\nexport function isAdBlockerNetworkError(error: unknown): boolean {\n if (error instanceof Error) {\n return error.message.includes(\"Failed to fetch\")\n || error.message.includes(\"NetworkError\")\n || error.message.includes(\"Load failed\")\n || error.message.includes(\"network connection\");\n }\n return false;\n}\n\nexport class SessionRecorder {\n private _started = false;\n private _cancelled = false;\n private _disabled = false;\n private _stopRecording: (() => void) | null = null;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: unknown[] = [];\n private _eventSizes: number[] = [];\n private _approxBytes = 0;\n private _lastPersistActivity = 0;\n private _recording = false;\n private _rrwebModule: typeof import(\"rrweb\") | null = null;\n private _lastBrowserSessionId: string | null = null;\n private _takingSnapshot = false;\n private _flushInProgress = false;\n private readonly _sessionReplaySegmentId: string;\n private readonly _storageKey: string;\n // Hexclave rebrand: legacy key used for dual-read fallback only.\n private readonly _legacyStorageKey: string;\n private readonly _deps: SessionRecorderDeps;\n private readonly _replayOptions: AnalyticsReplayOptions;\n\n constructor(deps: SessionRecorderDeps, replayOptions: AnalyticsReplayOptions) {\n this._deps = deps;\n this._replayOptions = replayOptions;\n this._sessionReplaySegmentId = generateUuid();\n this._storageKey = makeStorageKey(deps.projectId);\n this._legacyStorageKey = makeLegacyStorageKey(deps.projectId);\n }\n\n /**\n * Starts recording. Idempotent — calling multiple times is safe.\n */\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n this._started = true;\n\n // Kick off rrweb recording\n runAsynchronously(() => this._startRecording(), { noErrorLogging: true });\n\n // Periodic flush\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n // Flush remaining events before cleanup\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._stopCurrentRecording();\n }\n\n clearBuffer() {\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n }\n\n private _persistActivity(nowMs: number): StoredSession {\n const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });\n if (nowMs - this._lastPersistActivity < 5_000) return stored;\n this._lastPersistActivity = nowMs;\n const updated: StoredSession = { ...stored, last_activity_ms: nowMs };\n localStorage.setItem(this._storageKey, JSON.stringify(updated));\n return stored;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._disabled) return;\n if (this._events.length === 0) return;\n // Prevent concurrent in-flight HTTP requests. When a flush is already\n // in-flight, a second batch could race on the server (both call\n // findRecentSessionReplay before either upsert commits) and create\n // duplicate SessionReplay records. Events stay in _events and will be\n // picked up by the next tick or batch-size check.\n if (this._flushInProgress) return;\n\n const nowMs = Date.now();\n const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });\n\n // Capture all buffered events upfront (before any await) so that\n // stop() / _stopCurrentRecording() clearing this._events cannot race\n // with the async send loop below and silently discard overflow batches.\n const allEvents = this._events;\n const allSizes = this._eventSizes;\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n\n // Non-keepalive flushes gzip before sending, so a single event up to the\n // server's decompressed budget can be sent alone. Keepalive flushes\n // (pagehide/visibilitychange/stop) skip async gzip to dispatch before page\n // tear-down, so they're bound by the server's raw ~1MB body limit; cap their\n // single-event size at the uncompressed batch target so an oversized event\n // is dropped rather than 413-ing the flush and losing the events behind it.\n const maxSingleEventBytes = options.keepalive ? MAX_BATCH_UNCOMPRESSED_BYTES : MAX_SINGLE_EVENT_BYTES;\n\n this._flushInProgress = true;\n try {\n let offset = 0;\n while (offset < allEvents.length) {\n // A single event over the limit can't be sent (rrweb events aren't\n // splittable); drop it and move on to the rest of the buffer.\n const firstSize = allSizes[offset] ?? throwErr(\"_eventSizes out of sync with _events — this should never happen\");\n if (firstSize > maxSingleEventBytes) {\n captureWarning(\n \"SessionRecorder.flush\",\n new Error(`Dropping oversized session replay event (${firstSize} bytes > ${maxSingleEventBytes} byte limit); it cannot be sent without exceeding the server's body limit.`),\n );\n offset += 1;\n continue;\n }\n\n let batchBytes = 0;\n let batchEnd = offset;\n for (let i = offset; i < allEvents.length; i++) {\n const nextSize = allSizes[i] ?? throwErr(\"_eventSizes out of sync with _events — this should never happen\");\n if (batchBytes + nextSize > MAX_BATCH_UNCOMPRESSED_BYTES && batchEnd > offset) break;\n batchBytes += nextSize;\n batchEnd = i + 1;\n }\n\n const batchEvents = allEvents.slice(offset, batchEnd);\n offset = batchEnd;\n\n const batchId = generateUuid();\n const payload = {\n browser_session_id: stored.session_id,\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n started_at_ms: stored.created_at_ms,\n sent_at_ms: nowMs,\n events: batchEvents,\n };\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n if (isAnalyticsNotEnabledError(res.error)) {\n this._disable();\n return;\n }\n // Ad blockers commonly block analytics endpoints, causing network\n // errors. These are expected and should not pollute the console.\n if (isAdBlockerNetworkError(res.error)) {\n return;\n }\n captureWarning(\"SessionRecorder.flush\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n // On any non-2xx we stop the loop, so this batch and every event still\n // buffered behind it are dropped (not retried). Count them for the log.\n const droppedCount = batchEvents.length + (allEvents.length - offset);\n if (res.data.status === 413) {\n // The payload exceeded the server's body limit despite the client-side\n // size caps — most likely a single poorly-compressible event (e.g. an\n // embedded image/canvas) that gzipped above the wire limit. Distinct\n // from other failures because the caps are supposed to prevent it.\n captureWarning(\n \"SessionRecorder.flush\",\n new Error(`Session replay batch rejected with 413 (payload too large) despite client-side size caps; dropping ${droppedCount} buffered event(s). A poorly-compressible event likely exceeded the server's body limit after gzip.`),\n );\n return;\n }\n captureWarning(\"SessionRecorder.flush\", new Error(`SessionRecorder flush failed (dropping ${droppedCount} buffered event(s)): ${res.data.status} ${await res.data.text()}`));\n return;\n }\n }\n } finally {\n this._flushInProgress = false;\n }\n }\n\n private _disable() {\n this._disabled = true;\n this.clearBuffer();\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n this._stopCurrentRecording();\n }\n\n private async _startRecording() {\n if (this._recording || this._cancelled) return;\n\n if (!this._rrwebModule) {\n const rrwebImport = await Result.fromPromise(import(\"rrweb\"));\n if (rrwebImport.status === \"error\") {\n console.warn(\"SessionRecorder: rrweb import failed. Is rrweb installed?\", rrwebImport.error);\n return;\n }\n this._rrwebModule = rrwebImport.data;\n }\n\n // cancelled may change during the await above\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this._cancelled) return;\n\n this._stopRecording = this._rrwebModule.record({\n emit: (event) => {\n const nowMs = Date.now();\n const stored = this._persistActivity(nowMs);\n\n // Detect session rotation: after 3+ minutes idle, getOrRotateSession\n // creates a new session ID. We need to inject a FullSnapshot so the\n // new server-side SessionReplay record is playable.\n if (this._lastBrowserSessionId === null) {\n this._lastBrowserSessionId = stored.session_id;\n } else if (stored.session_id !== this._lastBrowserSessionId && !this._takingSnapshot) {\n this._lastBrowserSessionId = stored.session_id;\n // Inject a FullSnapshot for the new session (calls emit synchronously)\n this._takingSnapshot = true;\n try {\n this._rrwebModule!.record.takeFullSnapshot();\n } finally {\n this._takingSnapshot = false;\n }\n }\n\n // Measure UTF-8 byte length to match the server's byte limit (.length counts UTF-16 units, undercounting multibyte content).\n const eventSize = textEncoder.encode(JSON.stringify(event)).byteLength;\n this._events.push(event);\n this._eventSizes.push(eventSize);\n this._approxBytes += eventSize;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n },\n maskAllInputs: this._replayOptions.maskAllInputs ?? true,\n ...(this._replayOptions.blockClass !== undefined ? { blockClass: this._replayOptions.blockClass } : {}),\n ...(this._replayOptions.blockSelector !== undefined ? { blockSelector: this._replayOptions.blockSelector } : {}),\n }) ?? null;\n\n this._recording = true;\n\n const onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n window.addEventListener(\"pagehide\", onPageHide);\n document.addEventListener(\"visibilitychange\", onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", onPageHide);\n document.removeEventListener(\"visibilitychange\", onPageHide);\n };\n }\n\n private _stopCurrentRecording() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n if (this._stopRecording) {\n this._stopRecording();\n this._stopRecording = null;\n }\n this._events = [];\n this._eventSizes = [];\n this._approxBytes = 0;\n this._recording = false;\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":";;;;;;AAqDA,SAAgB,wBAAwB,kBAAwE;CAC9G,OAAO;EACL,GAAG,kBAAkB;EACrB,SAAS,kBAAkB,SAAS,WAAW;CACjD;AACF;;;;;;;AAQA,SAAgB,uBAAuB,SAAqE;CAC1G,IAAI,CAAC,SAAS,SAAS,YAAY,OAAO;CAC1C,MAAM,EAAE,YAAY,GAAG,SAAS,QAAQ;CACxC,IAAI,EAAE,sBAAsB,SAAS,OAAO;CAC5C,OAAO;EACL,GAAG;EACH,SAAS;GACP,GAAG;GAEH,YAAY;IAAE,UAAU,WAAW;IAAQ,SAAS,WAAW;GAAM;EACvE;CACF;AACF;;;;;AAMA,SAAgB,yBAAyB,MAAkE;CACzG,IAAI,CAAC,MAAM,SAAS,YAAY,OAAO;CACvC,MAAM,EAAE,YAAY,GAAG,SAAS,KAAK;CACrC,IAAI,OAAO,eAAe,YAAY,cAAc,YAAY;EAC9D,MAAM,KAAK;EACX,OAAO;GACL,GAAG;GACH,SAAS;IACP,GAAG;IACH,YAAY,IAAI,OAAO,GAAG,UAAU,GAAG,OAAO;GAChD;EACF;CACF;CACA,OAAO;AACT;AAKA,MAAM,uBAAuB;AAG7B,MAAM,8BAA8B;AACpC,MAAM,cAAc,MAAS;AAE7B,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,6BAA6B;AAEnC,MAAM,+BAA+B;AAQrC,MAAM,yBAAyB,IAAI,OAAO,OAAO;AAGjD,MAAM,cAAc,IAAI,YAAY;AAQpC,SAAgB,uBAAuB,KAA0C;CAC/E,IAAI,CAAC,KAAK,OAAO;CACjB,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,GAAG;EAC7B,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM,OAAO;EAC1D,IAAI,OAAO,OAAO,eAAe,UAAU,OAAO;EAClD,IAAI,OAAO,OAAO,kBAAkB,UAAU,OAAO;EACrD,IAAI,OAAO,OAAO,qBAAqB,UAAU,OAAO;EACxD,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,eAAe,WAAmB;CAChD,OAAO,GAAG,qBAAqB,GAAG;AACpC;AAGA,SAAgB,qBAAqB,WAAmB;CACtD,OAAO,GAAG,4BAA4B,GAAG;AAC3C;AAEA,SAAgB,eAAe;CAC7B,OAAO,OAAO,WAAW;AAC3B;AAEA,SAAgB,mBAAmB,SAA4E;CAG7G,MAAM,WAAW,uBAAuB,aAAa,QAAQ,QAAQ,GAAG,CAAC,MACnE,QAAQ,YAAY,uBAAuB,aAAa,QAAQ,QAAQ,SAAS,CAAC,IAAI;CAC5F,IAAI,YAAY,QAAQ,QAAQ,SAAS,oBAAoB,aAC3D,OAAO;CAET,MAAM,OAAsB;EAC1B,YAAY,aAAa;EACzB,eAAe,QAAQ;EACvB,kBAAkB,QAAQ;CAC5B;CACA,aAAa,QAAQ,QAAQ,KAAK,KAAK,UAAU,IAAI,CAAC;CACtD,OAAO;AACT;AAOA,SAAgB,2BAA2B,OAAyB;CAClE,OAAO,YAAY,oBAAoB,WAAW,KAAK;AACzD;;;;;;AAOA,SAAgB,wBAAwB,OAAyB;CAC/D,IAAI,iBAAiB,OACnB,OAAO,MAAM,QAAQ,SAAS,iBAAiB,KAC1C,MAAM,QAAQ,SAAS,cAAc,KACrC,MAAM,QAAQ,SAAS,aAAa,KACpC,MAAM,QAAQ,SAAS,oBAAoB;CAElD,OAAO;AACT;AAEA,IAAa,kBAAb,MAA6B;CAuB3B,YAAY,MAA2B,eAAuC;kBAtB3D;oBACE;mBACD;wBAC0B;0BACE;qBACa;iBAChC,CAAC;qBACE,CAAC;sBACV;8BACQ;oBACV;sBACiC;+BACP;yBACrB;0BACC;EASzB,KAAK,QAAQ;EACb,KAAK,iBAAiB;EACtB,KAAK,0BAA0B,aAAa;EAC5C,KAAK,cAAc,eAAe,KAAK,SAAS;EAChD,KAAK,oBAAoB,qBAAqB,KAAK,SAAS;CAC9D;;;;CAKA,QAAQ;EACN,IAAI,KAAK,UAAU;EACnB,IAAI,CAAC,cAAc,GAAG;EACtB,KAAK,WAAW;EAGhB,wBAAwB,KAAK,gBAAgB,GAAG,EAAE,gBAAgB,KAAK,CAAC;EAGxE,KAAK,cAAc,kBAAkB,KAAK,MAAM,GAAG,iBAAiB;CACtE;CAEA,OAAO;EACL,KAAK,aAAa;EAClB,IAAI,KAAK,gBAAgB,MAAM;GAC7B,cAAc,KAAK,WAAW;GAC9B,KAAK,cAAc;EACrB;EAEA,wBAAwB,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC;EACxD,KAAK,sBAAsB;CAC7B;CAEA,cAAc;EACZ,KAAK,UAAU,CAAC;EAChB,KAAK,cAAc,CAAC;EACpB,KAAK,eAAe;CACtB;CAEA,iBAAyB,OAA8B;EACrD,MAAM,SAAS,mBAAmB;GAAE,KAAK,KAAK;GAAa,WAAW,KAAK;GAAmB;EAAM,CAAC;EACrG,IAAI,QAAQ,KAAK,uBAAuB,KAAO,OAAO;EACtD,KAAK,uBAAuB;EAC5B,MAAM,UAAyB;GAAE,GAAG;GAAQ,kBAAkB;EAAM;EACpE,aAAa,QAAQ,KAAK,aAAa,KAAK,UAAU,OAAO,CAAC;EAC9D,OAAO;CACT;CAEA,MAAc,OAAO,SAAiC;EACpD,IAAI,KAAK,WAAW;EACpB,IAAI,KAAK,QAAQ,WAAW,GAAG;EAM/B,IAAI,KAAK,kBAAkB;EAE3B,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,SAAS,mBAAmB;GAAE,KAAK,KAAK;GAAa,WAAW,KAAK;GAAmB;EAAM,CAAC;EAKrG,MAAM,YAAY,KAAK;EACvB,MAAM,WAAW,KAAK;EACtB,KAAK,UAAU,CAAC;EAChB,KAAK,cAAc,CAAC;EACpB,KAAK,eAAe;EAQpB,MAAM,sBAAsB,QAAQ,YAAY,+BAA+B;EAE/E,KAAK,mBAAmB;EACxB,IAAI;GACF,IAAI,SAAS;GACb,OAAO,SAAS,UAAU,QAAQ;IAGhC,MAAM,YAAY,SAAS,WAAW,SAAS,iEAAiE;IAChH,IAAI,YAAY,qBAAqB;KACnC,eACE,yCACA,IAAI,MAAM,4CAA4C,UAAU,WAAW,oBAAoB,2EAA2E,CAC5K;KACA,UAAU;KACV;IACF;IAEA,IAAI,aAAa;IACjB,IAAI,WAAW;IACf,KAAK,IAAI,IAAI,QAAQ,IAAI,UAAU,QAAQ,KAAK;KAC9C,MAAM,WAAW,SAAS,MAAM,SAAS,iEAAiE;KAC1G,IAAI,aAAa,WAAW,gCAAgC,WAAW,QAAQ;KAC/E,cAAc;KACd,WAAW,IAAI;IACjB;IAEA,MAAM,cAAc,UAAU,MAAM,QAAQ,QAAQ;IACpD,SAAS;IAET,MAAM,UAAU,aAAa;IAC7B,MAAM,UAAU;KACd,oBAAoB,OAAO;KAC3B,2BAA2B,KAAK;KAChC,UAAU;KACV,eAAe,OAAO;KACtB,YAAY;KACZ,QAAQ;IACV;IAEA,MAAM,MAAM,MAAM,KAAK,MAAM,UAC3B,KAAK,UAAU,OAAO,GACtB,EAAE,WAAW,QAAQ,UAAU,CACjC;IAEA,IAAI,IAAI,WAAW,SAAS;KAC1B,IAAI,2BAA2B,IAAI,KAAK,GAAG;MACzC,KAAK,SAAS;MACd;KACF;KAGA,IAAI,wBAAwB,IAAI,KAAK,GACnC;KAEF,eAAe,yBAAyB,IAAI,KAAK;KACjD;IACF;IAEA,IAAI,CAAC,IAAI,KAAK,IAAI;KAGhB,MAAM,eAAe,YAAY,UAAU,UAAU,SAAS;KAC9D,IAAI,IAAI,KAAK,WAAW,KAAK;MAK3B,eACE,yCACA,IAAI,MAAM,sGAAsG,aAAa,oGAAoG,CACnO;MACA;KACF;KACA,eAAe,yCAAyB,IAAI,MAAM,0CAA0C,aAAa,uBAAuB,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;KAC3K;IACF;GACF;EACF,UAAU;GACR,KAAK,mBAAmB;EAC1B;CACF;CAEA,WAAmB;EACjB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,IAAI,KAAK,gBAAgB,MAAM;GAC7B,cAAc,KAAK,WAAW;GAC9B,KAAK,cAAc;EACrB;EACA,KAAK,sBAAsB;CAC7B;CAEA,MAAc,kBAAkB;EAC9B,IAAI,KAAK,cAAc,KAAK,YAAY;EAExC,IAAI,CAAC,KAAK,cAAc;GACtB,MAAM,cAAc,MAAM,OAAO,YAAY,OAAO,QAAQ;GAC5D,IAAI,YAAY,WAAW,SAAS;IAClC,QAAQ,KAAK,6DAA6D,YAAY,KAAK;IAC3F;GACF;GACA,KAAK,eAAe,YAAY;EAClC;EAIA,IAAI,KAAK,YAAY;EAErB,KAAK,iBAAiB,KAAK,aAAa,OAAO;GAC7C,OAAO,UAAU;IACf,MAAM,QAAQ,KAAK,IAAI;IACvB,MAAM,SAAS,KAAK,iBAAiB,KAAK;IAK1C,IAAI,KAAK,0BAA0B,MACjC,KAAK,wBAAwB,OAAO;SAC/B,IAAI,OAAO,eAAe,KAAK,yBAAyB,CAAC,KAAK,iBAAiB;KACpF,KAAK,wBAAwB,OAAO;KAEpC,KAAK,kBAAkB;KACvB,IAAI;MACF,KAAK,aAAc,OAAO,iBAAiB;KAC7C,UAAU;MACR,KAAK,kBAAkB;KACzB;IACF;IAGA,MAAM,YAAY,YAAY,OAAO,KAAK,UAAU,KAAK,CAAC,CAAC,CAAC;IAC5D,KAAK,QAAQ,KAAK,KAAK;IACvB,KAAK,YAAY,KAAK,SAAS;IAC/B,KAAK,gBAAgB;IACrB,IAAI,KAAK,QAAQ,UAAU,wBAAwB,KAAK,gBAAgB,4BACtE,wBAAwB,KAAK,OAAO,EAAE,WAAW,MAAM,CAAC,CAAC;GAE7D;GACA,eAAe,KAAK,eAAe,iBAAiB;GACpD,GAAI,KAAK,eAAe,eAAe,KAAA,IAAY,EAAE,YAAY,KAAK,eAAe,WAAW,IAAI,CAAC;GACrG,GAAI,KAAK,eAAe,kBAAkB,KAAA,IAAY,EAAE,eAAe,KAAK,eAAe,cAAc,IAAI,CAAC;EAChH,CAAC,KAAK;EAEN,KAAK,aAAa;EAElB,MAAM,mBAAmB;GACvB,wBAAwB,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC;EAC1D;EACA,OAAO,iBAAiB,YAAY,UAAU;EAC9C,SAAS,iBAAiB,oBAAoB,UAAU;EACxD,KAAK,yBAAyB;GAC5B,OAAO,oBAAoB,YAAY,UAAU;GACjD,SAAS,oBAAoB,oBAAoB,UAAU;EAC7D;CACF;CAEA,wBAAgC;EAC9B,IAAI,KAAK,kBAAkB;GACzB,KAAK,iBAAiB;GACtB,KAAK,mBAAmB;EAC1B;EACA,IAAI,KAAK,gBAAgB;GACvB,KAAK,eAAe;GACpB,KAAK,iBAAiB;EACxB;EACA,KAAK,UAAU,CAAC;EAChB,KAAK,cAAc,CAAC;EACpB,KAAK,eAAe;EACpB,KAAK,aAAa;CACpB;CAEA,QAAgB;EACd,IAAI,KAAK,YAAY;EACrB,IAAI,KAAK,QAAQ,SAAS,GACxB,wBAAwB,KAAK,OAAO,EAAE,WAAW,MAAM,CAAC,CAAC;CAE7D;AACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import * as errors from "@hexclave/shared/dist/utils/errors";
|
|
1
2
|
import { describe, expect, it, vi } from "vitest";
|
|
2
3
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
3
4
|
import { KnownErrors } from "@hexclave/shared/dist/known-errors";
|
|
4
5
|
import { SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions } from "./session-replay.js";
|
|
5
|
-
|
|
6
6
|
//#region src/lib/hexclave-app/apps/implementations/session-replay.test.ts
|
|
7
7
|
// @vitest-environment jsdom
|
|
8
8
|
describe("session replay options", () => {
|
|
@@ -165,6 +165,137 @@ describe("SessionRecorder flush", () => {
|
|
|
165
165
|
vi.useRealTimers();
|
|
166
166
|
}
|
|
167
167
|
});
|
|
168
|
+
it("drops a single event that exceeds the server's decompressed budget", async () => {
|
|
169
|
+
vi.useFakeTimers();
|
|
170
|
+
const storageKey = `hexclave:session-replay:v1:test-project`;
|
|
171
|
+
localStorage.setItem(storageKey, JSON.stringify({
|
|
172
|
+
session_id: "test-session",
|
|
173
|
+
created_at_ms: Date.now(),
|
|
174
|
+
last_activity_ms: Date.now()
|
|
175
|
+
}));
|
|
176
|
+
const sentBodies = [];
|
|
177
|
+
const recorder = new SessionRecorder({
|
|
178
|
+
projectId: "test-project",
|
|
179
|
+
sendBatch: async (body) => {
|
|
180
|
+
sentBodies.push(body);
|
|
181
|
+
return Result.ok(new Response("ok", { status: 200 }));
|
|
182
|
+
}
|
|
183
|
+
}, {});
|
|
184
|
+
try {
|
|
185
|
+
const hugeEvent = {
|
|
186
|
+
type: 2,
|
|
187
|
+
timestamp: Date.now(),
|
|
188
|
+
data: "z".repeat(9e6)
|
|
189
|
+
};
|
|
190
|
+
const smallEvent = {
|
|
191
|
+
type: 3,
|
|
192
|
+
timestamp: Date.now(),
|
|
193
|
+
data: "ok"
|
|
194
|
+
};
|
|
195
|
+
const sizeOf = (e) => JSON.stringify(e).length;
|
|
196
|
+
recorder._events = [hugeEvent, smallEvent];
|
|
197
|
+
recorder._eventSizes = [sizeOf(hugeEvent), sizeOf(smallEvent)];
|
|
198
|
+
recorder._approxBytes = sizeOf(hugeEvent) + sizeOf(smallEvent);
|
|
199
|
+
recorder._tick();
|
|
200
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
201
|
+
expect(sentBodies).toHaveLength(1);
|
|
202
|
+
const batch = JSON.parse(sentBodies[0]);
|
|
203
|
+
expect(batch.events).toHaveLength(1);
|
|
204
|
+
expect(batch.events[0].type).toBe(3);
|
|
205
|
+
} finally {
|
|
206
|
+
recorder.stop();
|
|
207
|
+
localStorage.removeItem(storageKey);
|
|
208
|
+
vi.useRealTimers();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
it("on a keepalive flush, drops an event over the uncompressed batch target (it can't be gzipped before page tear-down)", async () => {
|
|
212
|
+
vi.useFakeTimers();
|
|
213
|
+
const storageKey = `hexclave:session-replay:v1:test-project`;
|
|
214
|
+
localStorage.setItem(storageKey, JSON.stringify({
|
|
215
|
+
session_id: "test-session",
|
|
216
|
+
created_at_ms: Date.now(),
|
|
217
|
+
last_activity_ms: Date.now()
|
|
218
|
+
}));
|
|
219
|
+
const sentBodies = [];
|
|
220
|
+
const recorder = new SessionRecorder({
|
|
221
|
+
projectId: "test-project",
|
|
222
|
+
sendBatch: async (body) => {
|
|
223
|
+
sentBodies.push(body);
|
|
224
|
+
return Result.ok(new Response("ok", { status: 200 }));
|
|
225
|
+
}
|
|
226
|
+
}, {});
|
|
227
|
+
try {
|
|
228
|
+
const midEvent = {
|
|
229
|
+
type: 2,
|
|
230
|
+
timestamp: Date.now(),
|
|
231
|
+
data: "z".repeat(2e6)
|
|
232
|
+
};
|
|
233
|
+
const smallEvent = {
|
|
234
|
+
type: 3,
|
|
235
|
+
timestamp: Date.now(),
|
|
236
|
+
data: "ok"
|
|
237
|
+
};
|
|
238
|
+
const sizeOf = (e) => new TextEncoder().encode(JSON.stringify(e)).byteLength;
|
|
239
|
+
recorder._events = [midEvent, smallEvent];
|
|
240
|
+
recorder._eventSizes = [sizeOf(midEvent), sizeOf(smallEvent)];
|
|
241
|
+
recorder._approxBytes = sizeOf(midEvent) + sizeOf(smallEvent);
|
|
242
|
+
await recorder._flush({ keepalive: true });
|
|
243
|
+
expect(sentBodies).toHaveLength(1);
|
|
244
|
+
const batch = JSON.parse(sentBodies[0]);
|
|
245
|
+
expect(batch.events).toHaveLength(1);
|
|
246
|
+
expect(batch.events[0].type).toBe(3);
|
|
247
|
+
} finally {
|
|
248
|
+
recorder.stop();
|
|
249
|
+
localStorage.removeItem(storageKey);
|
|
250
|
+
vi.useRealTimers();
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
it("logs a distinct 413 warning and drops the buffered events when the server rejects a batch as too large", async () => {
|
|
254
|
+
vi.useFakeTimers();
|
|
255
|
+
const captureWarningSpy = vi.spyOn(errors, "captureWarning").mockImplementation(() => {});
|
|
256
|
+
const storageKey = `hexclave:session-replay:v1:test-project`;
|
|
257
|
+
localStorage.setItem(storageKey, JSON.stringify({
|
|
258
|
+
session_id: "test-session",
|
|
259
|
+
created_at_ms: Date.now(),
|
|
260
|
+
last_activity_ms: Date.now()
|
|
261
|
+
}));
|
|
262
|
+
let calls = 0;
|
|
263
|
+
const recorder = new SessionRecorder({
|
|
264
|
+
projectId: "test-project",
|
|
265
|
+
sendBatch: async () => {
|
|
266
|
+
calls += 1;
|
|
267
|
+
return Result.ok(new Response("payload too large", { status: 413 }));
|
|
268
|
+
}
|
|
269
|
+
}, {});
|
|
270
|
+
try {
|
|
271
|
+
const eventA = {
|
|
272
|
+
type: 3,
|
|
273
|
+
timestamp: Date.now(),
|
|
274
|
+
data: "a"
|
|
275
|
+
};
|
|
276
|
+
const eventB = {
|
|
277
|
+
type: 3,
|
|
278
|
+
timestamp: Date.now(),
|
|
279
|
+
data: "b"
|
|
280
|
+
};
|
|
281
|
+
const sizeOf = (e) => new TextEncoder().encode(JSON.stringify(e)).byteLength;
|
|
282
|
+
recorder._events = [eventA, eventB];
|
|
283
|
+
recorder._eventSizes = [sizeOf(eventA), sizeOf(eventB)];
|
|
284
|
+
recorder._approxBytes = sizeOf(eventA) + sizeOf(eventB);
|
|
285
|
+
await recorder._flush({ keepalive: false });
|
|
286
|
+
expect(calls).toBe(1);
|
|
287
|
+
expect(captureWarningSpy).toHaveBeenCalledTimes(1);
|
|
288
|
+
const warned = captureWarningSpy.mock.calls[0]?.[1];
|
|
289
|
+
expect(warned).toBeInstanceOf(Error);
|
|
290
|
+
expect(warned.message).toContain("413");
|
|
291
|
+
expect(warned.message).toContain("2 buffered event");
|
|
292
|
+
} finally {
|
|
293
|
+
recorder.stop();
|
|
294
|
+
localStorage.removeItem(storageKey);
|
|
295
|
+
captureWarningSpy.mockRestore();
|
|
296
|
+
vi.useRealTimers();
|
|
297
|
+
}
|
|
298
|
+
});
|
|
168
299
|
it("silently disables when client interface returns ANALYTICS_NOT_ENABLED as an error", async () => {
|
|
169
300
|
vi.useFakeTimers();
|
|
170
301
|
const storageKey = `hexclave:session-replay:v1:test-project`;
|
|
@@ -212,7 +343,7 @@ describe("SessionRecorder flush", () => {
|
|
|
212
343
|
}
|
|
213
344
|
});
|
|
214
345
|
});
|
|
215
|
-
|
|
216
346
|
//#endregion
|
|
217
|
-
export {
|
|
347
|
+
export {};
|
|
348
|
+
|
|
218
349
|
//# sourceMappingURL=session-replay.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions, SessionRecorder } from \"./session-replay\";\n\ndescribe(\"session replay options\", () => {\n it(\"enables replays by default\", () => {\n expect(getSessionReplayOptions(undefined).enabled).toBe(true);\n expect(getSessionReplayOptions({}).enabled).toBe(true);\n expect(getSessionReplayOptions({ replays: {} }).enabled).toBe(true);\n });\n\n it(\"preserves explicit replay opt-out\", () => {\n expect(getSessionReplayOptions({ replays: { enabled: false } }).enabled).toBe(false);\n });\n});\n\ndescribe(\"analytics option JSON conversion\", () => {\n it(\"preserves top-level analytics options when serializing replay block classes\", () => {\n const json = analyticsOptionsToJson({\n enabled: false,\n replays: {\n enabled: true,\n blockClass: /stack-sensitive/u,\n },\n });\n\n expect(json?.enabled).toBe(false);\n expect(json?.replays?.enabled).toBe(true);\n });\n\n it(\"preserves top-level analytics options when deserializing replay block classes\", () => {\n const roundTripped = analyticsOptionsFromJson(analyticsOptionsToJson({\n enabled: false,\n replays: {\n blockClass: /stack-sensitive/u,\n },\n }));\n\n expect(roundTripped?.enabled).toBe(false);\n expect(roundTripped?.replays?.blockClass).toEqual(/stack-sensitive/u);\n });\n});\n\ndescribe(\"SessionRecorder flush\", () => {\n it(\"silently ignores network errors caused by ad blockers\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new TypeError(\"Failed to fetch\"));\n },\n },\n {},\n );\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n\n try {\n const event1 = { type: 2, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n // Unlike ANALYTICS_NOT_ENABLED, ad blocker errors do NOT disable the\n // recorder — subsequent flushes continue attempting delivery.\n const event2 = { type: 3, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n expect(sentBodies).toHaveLength(2);\n expect(warnSpy).not.toHaveBeenCalled();\n } finally {\n recorder.stop();\n warnSpy.mockRestore();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"splits large batches into multiple requests to stay under server 1MB limit\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // Create events that together exceed 900KB (the per-batch cap).\n // Each event is ~500KB, so two events (~1MB) must be split into two batches.\n const largeData = \"x\".repeat(500_000);\n const event1 = { type: 2, timestamp: Date.now(), data: largeData };\n const event2 = { type: 3, timestamp: Date.now(), data: largeData };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1, event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length, JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = JSON.stringify(event1).length + JSON.stringify(event2).length;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n // Should have sent two separate batches\n expect(sentBodies).toHaveLength(2);\n\n // Each batch should contain exactly one event\n const batch1 = JSON.parse(sentBodies[0]);\n const batch2 = JSON.parse(sentBodies[1]);\n expect(batch1.events).toHaveLength(1);\n expect(batch2.events).toHaveLength(1);\n\n // They should have different batch IDs\n expect(batch1.batch_id).not.toBe(batch2.batch_id);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"sends a single oversized event alone without dropping it\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // A single event larger than 900KB — should still be sent (not dropped)\n const hugeData = \"y\".repeat(1_000_000);\n const hugeEvent = { type: 2, timestamp: Date.now(), data: hugeData };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [hugeEvent];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(hugeEvent).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = JSON.stringify(hugeEvent).length;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n // Should still send the event (the server may reject it, but we don't drop it client-side)\n expect(sentBodies).toHaveLength(1);\n const batch = JSON.parse(sentBodies[0]);\n expect(batch.events).toHaveLength(1);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"silently disables when client interface returns ANALYTICS_NOT_ENABLED as an error\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new KnownErrors.AnalyticsNotEnabled());\n },\n },\n {},\n );\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n\n try {\n const event1 = { type: 2, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n const event2 = { type: 3, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n expect(sentBodies).toHaveLength(1);\n } finally {\n recorder.stop();\n warnSpy.mockRestore();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-replay.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/session-replay.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport * as errors from \"@hexclave/shared/dist/utils/errors\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions, SessionRecorder } from \"./session-replay\";\n\ndescribe(\"session replay options\", () => {\n it(\"enables replays by default\", () => {\n expect(getSessionReplayOptions(undefined).enabled).toBe(true);\n expect(getSessionReplayOptions({}).enabled).toBe(true);\n expect(getSessionReplayOptions({ replays: {} }).enabled).toBe(true);\n });\n\n it(\"preserves explicit replay opt-out\", () => {\n expect(getSessionReplayOptions({ replays: { enabled: false } }).enabled).toBe(false);\n });\n});\n\ndescribe(\"analytics option JSON conversion\", () => {\n it(\"preserves top-level analytics options when serializing replay block classes\", () => {\n const json = analyticsOptionsToJson({\n enabled: false,\n replays: {\n enabled: true,\n blockClass: /stack-sensitive/u,\n },\n });\n\n expect(json?.enabled).toBe(false);\n expect(json?.replays?.enabled).toBe(true);\n });\n\n it(\"preserves top-level analytics options when deserializing replay block classes\", () => {\n const roundTripped = analyticsOptionsFromJson(analyticsOptionsToJson({\n enabled: false,\n replays: {\n blockClass: /stack-sensitive/u,\n },\n }));\n\n expect(roundTripped?.enabled).toBe(false);\n expect(roundTripped?.replays?.blockClass).toEqual(/stack-sensitive/u);\n });\n});\n\ndescribe(\"SessionRecorder flush\", () => {\n it(\"silently ignores network errors caused by ad blockers\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new TypeError(\"Failed to fetch\"));\n },\n },\n {},\n );\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n\n try {\n const event1 = { type: 2, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n // Unlike ANALYTICS_NOT_ENABLED, ad blocker errors do NOT disable the\n // recorder — subsequent flushes continue attempting delivery.\n const event2 = { type: 3, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n expect(sentBodies).toHaveLength(2);\n expect(warnSpy).not.toHaveBeenCalled();\n } finally {\n recorder.stop();\n warnSpy.mockRestore();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"splits large batches into multiple requests to stay under server 1MB limit\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // Create events that together exceed 900KB (the per-batch cap).\n // Each event is ~500KB, so two events (~1MB) must be split into two batches.\n const largeData = \"x\".repeat(500_000);\n const event1 = { type: 2, timestamp: Date.now(), data: largeData };\n const event2 = { type: 3, timestamp: Date.now(), data: largeData };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1, event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length, JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = JSON.stringify(event1).length + JSON.stringify(event2).length;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n // Should have sent two separate batches\n expect(sentBodies).toHaveLength(2);\n\n // Each batch should contain exactly one event\n const batch1 = JSON.parse(sentBodies[0]);\n const batch2 = JSON.parse(sentBodies[1]);\n expect(batch1.events).toHaveLength(1);\n expect(batch2.events).toHaveLength(1);\n\n // They should have different batch IDs\n expect(batch1.batch_id).not.toBe(batch2.batch_id);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"sends a single oversized event alone without dropping it\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // A single event larger than 900KB — should still be sent (not dropped)\n const hugeData = \"y\".repeat(1_000_000);\n const hugeEvent = { type: 2, timestamp: Date.now(), data: hugeData };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [hugeEvent];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(hugeEvent).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = JSON.stringify(hugeEvent).length;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n // Sent (not dropped): the transport gzips it under the wire limit.\n expect(sentBodies).toHaveLength(1);\n const batch = JSON.parse(sentBodies[0]);\n expect(batch.events).toHaveLength(1);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"drops a single event that exceeds the server's decompressed budget\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // >8MB (MAX_SINGLE_EVENT_BYTES) is dropped; the next event still sends.\n const hugeEvent = { type: 2, timestamp: Date.now(), data: \"z\".repeat(9_000_000) };\n const smallEvent = { type: 3, timestamp: Date.now(), data: \"ok\" };\n const sizeOf = (e: unknown) => JSON.stringify(e).length;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [hugeEvent, smallEvent];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [sizeOf(hugeEvent), sizeOf(smallEvent)];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = sizeOf(hugeEvent) + sizeOf(smallEvent);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n expect(sentBodies).toHaveLength(1);\n const batch = JSON.parse(sentBodies[0]);\n expect(batch.events).toHaveLength(1);\n expect(batch.events[0].type).toBe(3);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"on a keepalive flush, drops an event over the uncompressed batch target (it can't be gzipped before page tear-down)\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response(\"ok\", { status: 200 }));\n },\n },\n {},\n );\n\n try {\n // ~2MB is under the 8MB gzipped ceiling but over the 900KB uncompressed\n // batch target. Keepalive flushes skip gzip, so this event would 413 the\n // server's ~1MB raw body limit; it must be dropped, but the next event\n // (small enough to send raw) still goes out.\n const midEvent = { type: 2, timestamp: Date.now(), data: \"z\".repeat(2_000_000) };\n const smallEvent = { type: 3, timestamp: Date.now(), data: \"ok\" };\n const sizeOf = (e: unknown) => new TextEncoder().encode(JSON.stringify(e)).byteLength;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [midEvent, smallEvent];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [sizeOf(midEvent), sizeOf(smallEvent)];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = sizeOf(midEvent) + sizeOf(smallEvent);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n await (recorder as any)._flush({ keepalive: true });\n\n expect(sentBodies).toHaveLength(1);\n const batch = JSON.parse(sentBodies[0]);\n expect(batch.events).toHaveLength(1);\n expect(batch.events[0].type).toBe(3);\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n\n it(\"logs a distinct 413 warning and drops the buffered events when the server rejects a batch as too large\", async () => {\n vi.useFakeTimers();\n const captureWarningSpy = vi.spyOn(errors, \"captureWarning\").mockImplementation(() => {});\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n let calls = 0;\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async () => {\n calls += 1;\n // A poorly-compressible event can clear the client-side caps yet still\n // exceed the server's body limit after gzip → 413.\n return Result.ok(new Response(\"payload too large\", { status: 413 }));\n },\n },\n {},\n );\n\n try {\n const eventA = { type: 3, timestamp: Date.now(), data: \"a\" };\n const eventB = { type: 3, timestamp: Date.now(), data: \"b\" };\n const sizeOf = (e: unknown) => new TextEncoder().encode(JSON.stringify(e)).byteLength;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [eventA, eventB];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [sizeOf(eventA), sizeOf(eventB)];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._approxBytes = sizeOf(eventA) + sizeOf(eventB);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n await (recorder as any)._flush({ keepalive: false });\n\n // The 413 stops the loop; no retry of the rejected batch.\n expect(calls).toBe(1);\n expect(captureWarningSpy).toHaveBeenCalledTimes(1);\n const warned = captureWarningSpy.mock.calls[0]?.[1];\n expect(warned).toBeInstanceOf(Error);\n expect((warned as Error).message).toContain(\"413\");\n // Both buffered events are reported as dropped.\n expect((warned as Error).message).toContain(\"2 buffered event\");\n } finally {\n recorder.stop();\n localStorage.removeItem(storageKey);\n captureWarningSpy.mockRestore();\n vi.useRealTimers();\n }\n });\n\n it(\"silently disables when client interface returns ANALYTICS_NOT_ENABLED as an error\", async () => {\n vi.useFakeTimers();\n\n const storageKey = `hexclave:session-replay:v1:test-project`;\n localStorage.setItem(storageKey, JSON.stringify({\n session_id: \"test-session\",\n created_at_ms: Date.now(),\n last_activity_ms: Date.now(),\n }));\n\n const sentBodies: string[] = [];\n const recorder = new SessionRecorder(\n {\n projectId: \"test-project\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new KnownErrors.AnalyticsNotEnabled());\n },\n },\n {},\n );\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n\n try {\n const event1 = { type: 2, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event1];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event1).length];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n const event2 = { type: 3, timestamp: Date.now(), data: {} };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._events = [event2];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (recorder as any)._eventSizes = [JSON.stringify(event2).length];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n (recorder as any)._tick();\n await vi.advanceTimersByTimeAsync(0);\n expect(sentBodies).toHaveLength(1);\n } finally {\n recorder.stop();\n warnSpy.mockRestore();\n localStorage.removeItem(storageKey);\n vi.useRealTimers();\n }\n });\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HexclaveClientApp, HexclaveClientAppConstructor, HexclaveClientAppConstructorOptions, HexclaveClientAppJson, StackClientApp, StackClientAppConstructor, StackClientAppConstructorOptions, StackClientAppJson } from "./interfaces/client-app";
|
|
2
|
-
import { HexclaveServerApp, HexclaveServerAppConstructor, HexclaveServerAppConstructorOptions, StackServerApp, StackServerAppConstructor, StackServerAppConstructorOptions } from "./interfaces/server-app";
|
|
3
|
-
import { HexclaveAdminApp, HexclaveAdminAppConstructor, HexclaveAdminAppConstructorOptions, StackAdminApp, StackAdminAppConstructor, StackAdminAppConstructorOptions } from "./interfaces/admin-app";
|
|
1
|
+
import { HexclaveClientApp, HexclaveClientAppConstructor, HexclaveClientAppConstructorOptions, HexclaveClientAppJson, StackClientApp, StackClientAppConstructor, StackClientAppConstructorOptions, StackClientAppJson } from "./interfaces/client-app.js";
|
|
2
|
+
import { HexclaveServerApp, HexclaveServerAppConstructor, HexclaveServerAppConstructorOptions, StackServerApp, StackServerAppConstructor, StackServerAppConstructorOptions } from "./interfaces/server-app.js";
|
|
3
|
+
import { HexclaveAdminApp, HexclaveAdminAppConstructor, HexclaveAdminAppConstructorOptions, StackAdminApp, StackAdminAppConstructor, StackAdminAppConstructorOptions } from "./interfaces/admin-app.js";
|
|
4
4
|
export { HexclaveAdminApp, type HexclaveAdminAppConstructor, type HexclaveAdminAppConstructorOptions, HexclaveClientApp, type HexclaveClientAppConstructor, type HexclaveClientAppConstructorOptions, type HexclaveClientAppJson, HexclaveServerApp, type HexclaveServerAppConstructor, type HexclaveServerAppConstructorOptions, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { HexclaveClientApp, StackClientApp } from "./interfaces/client-app.js";
|
|
2
2
|
import { HexclaveServerApp, StackServerApp } from "./interfaces/server-app.js";
|
|
3
3
|
import { HexclaveAdminApp, StackAdminApp } from "./interfaces/admin-app.js";
|
|
4
|
-
|
|
5
|
-
export { HexclaveAdminApp, HexclaveClientApp, HexclaveServerApp, StackAdminApp, StackClientApp, StackServerApp };
|
|
4
|
+
export { HexclaveAdminApp, HexclaveClientApp, HexclaveServerApp, StackAdminApp, StackClientApp, StackServerApp };
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { AnalyticsClickmapOptions, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse } from "@hexclave/shared/dist/interface/admin-metrics";
|
|
2
2
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
3
|
+
import { AsyncStoreProperty, EmailConfig } from "../../common.js";
|
|
4
|
+
import { InternalApiKey, InternalApiKeyCreateOptions, InternalApiKeyFirstView } from "../../internal-api-keys/index.js";
|
|
5
|
+
import { AdminProjectPermission, AdminProjectPermissionDefinition, AdminProjectPermissionDefinitionCreateOptions, AdminProjectPermissionDefinitionUpdateOptions, AdminTeamPermission, AdminTeamPermissionDefinition, AdminTeamPermissionDefinitionCreateOptions, AdminTeamPermissionDefinitionUpdateOptions } from "../../permissions/index.js";
|
|
6
|
+
import { AdminProject } from "../../projects/index.js";
|
|
3
7
|
import { InternalSession } from "@hexclave/shared/dist/sessions";
|
|
4
|
-
import { AsyncStoreProperty, EmailConfig } from "../../common";
|
|
5
8
|
import { AnalyticsQueryOptions, AnalyticsQueryResponse } from "@hexclave/shared/dist/interface/crud/analytics";
|
|
6
9
|
import { AdminGetSessionReplayChunkEventsResponse } from "@hexclave/shared/dist/interface/crud/session-replays";
|
|
7
10
|
import { Transaction, TransactionType } from "@hexclave/shared/dist/interface/crud/transactions";
|
|
8
11
|
import { MoneyAmount } from "@hexclave/shared/dist/utils/currency-constants";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { AdminSessionReplay, AdminSessionReplay as AdminSessionReplay$1, AdminSessionReplayChunk, ListSessionReplayChunksOptions, ListSessionReplayChunksOptions as ListSessionReplayChunksOptions$1, ListSessionReplayChunksResult, ListSessionReplayChunksResult as ListSessionReplayChunksResult$1, ListSessionReplaysOptions, ListSessionReplaysOptions as ListSessionReplaysOptions$1, ListSessionReplaysResult, ListSessionReplaysResult as ListSessionReplaysResult$1, SessionReplayAllEventsResult, SessionReplayAllEventsResult as SessionReplayAllEventsResult$1 } from "../../session-replays";
|
|
14
|
-
import { AdminEmailOutbox, AdminSentEmail } from "../../email";
|
|
15
|
-
import { StackServerApp, StackServerAppConstructorOptions } from "./server-app";
|
|
12
|
+
import { PlanUsage } from "../../plan-usage/index.js";
|
|
13
|
+
import { AdminSessionReplay, AdminSessionReplay as AdminSessionReplay$1, AdminSessionReplayChunk, ListSessionReplayChunksOptions, ListSessionReplayChunksOptions as ListSessionReplayChunksOptions$1, ListSessionReplayChunksResult, ListSessionReplayChunksResult as ListSessionReplayChunksResult$1, ListSessionReplaysOptions, ListSessionReplaysOptions as ListSessionReplaysOptions$1, ListSessionReplaysResult, ListSessionReplaysResult as ListSessionReplaysResult$1, SessionReplayAllEventsResult, SessionReplayAllEventsResult as SessionReplayAllEventsResult$1 } from "../../session-replays/index.js";
|
|
14
|
+
import { AdminEmailOutbox, AdminSentEmail } from "../../email/index.js";
|
|
15
|
+
import { StackServerApp, StackServerAppConstructorOptions } from "./server-app.js";
|
|
16
16
|
|
|
17
17
|
//#region src/lib/hexclave-app/apps/interfaces/admin-app.d.ts
|
|
18
18
|
type EmailOutboxListOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-app.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"mappings":";;;;;;;;;;;;;;;;;KAoBY,sBAAA;EACV,MAAA;EACA,YAAA;EACA,MAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,KAGU,qBAAA;EACV,KAAA,EAAO,
|
|
1
|
+
{"version":3,"file":"admin-app.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/interfaces/admin-app.ts"],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { _HexclaveAdminAppImpl } from "../implementations/index.js";
|
|
2
|
-
|
|
3
2
|
//#region src/lib/hexclave-app/apps/interfaces/admin-app.ts
|
|
4
3
|
const HexclaveAdminApp = _HexclaveAdminAppImpl;
|
|
5
4
|
/** @deprecated Use `HexclaveAdminApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */
|
|
6
5
|
const StackAdminApp = HexclaveAdminApp;
|
|
7
|
-
|
|
8
6
|
//#endregion
|
|
9
7
|
export { HexclaveAdminApp, StackAdminApp };
|
|
8
|
+
|
|
10
9
|
//# sourceMappingURL=admin-app.js.map
|