@payez/next-mvp 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +112 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +94 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +383 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +69 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +79 -0
- package/dist/config/vibe-log-transport.js +203 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +351 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +166 -0
- package/dist/lib/session-store.js +537 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +52 -0
- package/dist/lib/token-lifecycle.js +398 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +140 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +408 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +72 -0
- package/dist/routes/auth/session.js +180 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +201 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1531 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +23 -0
- package/dist/vibe/index.js +67 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* =============================================================================
|
|
4
|
+
* VIBE LOGIN SESSIONS
|
|
5
|
+
* =============================================================================
|
|
6
|
+
*
|
|
7
|
+
* Server-side utilities for managing login sessions in Vibe.
|
|
8
|
+
* Tracks user logins with location, device info, and allows session control.
|
|
9
|
+
*
|
|
10
|
+
* This module uses the MVP's vibe client with proper auth token handling
|
|
11
|
+
* for member-to-vibe calls.
|
|
12
|
+
*
|
|
13
|
+
* USAGE:
|
|
14
|
+
* ------
|
|
15
|
+
* import { createLoginSession, getUserSessions, revokeSession } from '@payez/next-mvp/vibe/sessions';
|
|
16
|
+
*
|
|
17
|
+
* // On login (requires user's access token):
|
|
18
|
+
* await createLoginSession({
|
|
19
|
+
* idpUserId: 22,
|
|
20
|
+
* email: 'user@example.com',
|
|
21
|
+
* ipAddress: '1.2.3.4',
|
|
22
|
+
* userAgent: '...',
|
|
23
|
+
* location: { city: 'NYC', ... },
|
|
24
|
+
* accessToken: userAccessToken, // Required for member-to-vibe
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Admin: revoke a session
|
|
28
|
+
* await revokeSession(sessionId, 'admin@example.com', accessToken, 'Suspicious activity');
|
|
29
|
+
*
|
|
30
|
+
* =============================================================================
|
|
31
|
+
*/
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createLoginSession = createLoginSession;
|
|
37
|
+
exports.getUserSessions = getUserSessions;
|
|
38
|
+
exports.getAllSessions = getAllSessions;
|
|
39
|
+
exports.getSessionById = getSessionById;
|
|
40
|
+
exports.revokeSession = revokeSession;
|
|
41
|
+
exports.revokeAllUserSessions = revokeAllUserSessions;
|
|
42
|
+
exports.updateSessionActivity = updateSessionActivity;
|
|
43
|
+
exports.isSessionValid = isSessionValid;
|
|
44
|
+
exports.checkSessionRevocation = checkSessionRevocation;
|
|
45
|
+
exports.getSessionStats = getSessionStats;
|
|
46
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
47
|
+
// -----------------------------------------------------------------------------
|
|
48
|
+
// CONFIGURATION
|
|
49
|
+
// -----------------------------------------------------------------------------
|
|
50
|
+
// Sessions expire after 30 days
|
|
51
|
+
const SESSION_EXPIRY_DAYS = 30;
|
|
52
|
+
// Table name in vibe_app collection
|
|
53
|
+
const TABLE = 'login_sessions';
|
|
54
|
+
const COLLECTION = 'vibe_app';
|
|
55
|
+
// Environment variables
|
|
56
|
+
const getEnv = (key) => {
|
|
57
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
58
|
+
return process.env[key] || '';
|
|
59
|
+
}
|
|
60
|
+
return '';
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Generate HMAC-SHA256 signature for proxy authentication
|
|
64
|
+
*/
|
|
65
|
+
function generateHmacSignature(signingKey, timestamp, method, endpoint) {
|
|
66
|
+
const stringToSign = `${timestamp}|${method}|${endpoint}`;
|
|
67
|
+
return crypto_1.default
|
|
68
|
+
.createHmac('sha256', Buffer.from(signingKey, 'base64'))
|
|
69
|
+
.update(stringToSign)
|
|
70
|
+
.digest('base64');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Make a request through the IDP Vibe proxy
|
|
74
|
+
*/
|
|
75
|
+
async function vibeProxyRequest(endpoint, method, accessToken, body) {
|
|
76
|
+
const idpUrl = getEnv('IDP_URL');
|
|
77
|
+
const clientId = getEnv('VIBE_CLIENT_ID');
|
|
78
|
+
const signingKey = getEnv('VIBE_HMAC_KEY');
|
|
79
|
+
if (!idpUrl || !clientId || !signingKey) {
|
|
80
|
+
console.error('[vibe-sessions] Missing env vars: IDP_URL, VIBE_CLIENT_ID, or VIBE_HMAC_KEY');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const proxyUrl = `${idpUrl}/api/vibe/proxy`;
|
|
84
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
85
|
+
const signature = generateHmacSignature(signingKey, timestamp, method, endpoint);
|
|
86
|
+
const headers = {
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
89
|
+
'X-Vibe-Client-Id': clientId,
|
|
90
|
+
'X-Vibe-Timestamp': String(timestamp),
|
|
91
|
+
'X-Vibe-Signature': signature,
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
const response = await fetch(proxyUrl, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers,
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
endpoint,
|
|
99
|
+
method,
|
|
100
|
+
data: body ?? null,
|
|
101
|
+
}),
|
|
102
|
+
});
|
|
103
|
+
if (response.status === 204) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (!response.ok) {
|
|
107
|
+
const errorText = await response.text();
|
|
108
|
+
console.error(`[vibe-sessions] Proxy error ${response.status}:`, errorText);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const data = await response.json();
|
|
112
|
+
// Unwrap IDP envelope if present
|
|
113
|
+
return (data?.data ?? data);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error('[vibe-sessions] Proxy request failed:', error);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// -----------------------------------------------------------------------------
|
|
121
|
+
// CREATE SESSION
|
|
122
|
+
// -----------------------------------------------------------------------------
|
|
123
|
+
/**
|
|
124
|
+
* Create a new login session record.
|
|
125
|
+
* Called when a user successfully logs in.
|
|
126
|
+
*
|
|
127
|
+
* @param input - Session creation parameters including accessToken
|
|
128
|
+
* @returns The created session, or null on failure
|
|
129
|
+
*/
|
|
130
|
+
async function createLoginSession(input) {
|
|
131
|
+
if (!input.accessToken) {
|
|
132
|
+
console.error('[vibe-sessions] accessToken is required for createLoginSession');
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const now = new Date();
|
|
136
|
+
const expiresAt = new Date(now.getTime() + SESSION_EXPIRY_DAYS * 24 * 60 * 60 * 1000);
|
|
137
|
+
const sessionData = {
|
|
138
|
+
idp_user_id: input.idpUserId,
|
|
139
|
+
email: input.email,
|
|
140
|
+
name: input.name || null,
|
|
141
|
+
// Location
|
|
142
|
+
ip_address: input.ipAddress,
|
|
143
|
+
city: input.location?.city || null,
|
|
144
|
+
region: input.location?.region || null,
|
|
145
|
+
country: input.location?.country || null,
|
|
146
|
+
country_code: input.location?.countryCode || null,
|
|
147
|
+
latitude: input.location?.latitude || null,
|
|
148
|
+
longitude: input.location?.longitude || null,
|
|
149
|
+
timezone: input.location?.timezone || null,
|
|
150
|
+
// Device
|
|
151
|
+
user_agent: input.userAgent,
|
|
152
|
+
device_type: input.device?.deviceType || 'unknown',
|
|
153
|
+
browser: input.device?.browser || 'Unknown',
|
|
154
|
+
browser_version: input.device?.browserVersion || null,
|
|
155
|
+
os: input.device?.os || 'Unknown',
|
|
156
|
+
os_version: input.device?.osVersion || null,
|
|
157
|
+
// Auth
|
|
158
|
+
oauth_provider: input.oauthProvider || null,
|
|
159
|
+
session_token_hash: input.sessionTokenHash || null,
|
|
160
|
+
// Status
|
|
161
|
+
status: 'active',
|
|
162
|
+
revoked_by: null,
|
|
163
|
+
revoked_at: null,
|
|
164
|
+
revoke_reason: null,
|
|
165
|
+
// Timestamps
|
|
166
|
+
last_activity: now.toISOString(),
|
|
167
|
+
expires_at: expiresAt.toISOString(),
|
|
168
|
+
};
|
|
169
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}`;
|
|
170
|
+
const session = await vibeProxyRequest(endpoint, 'POST', input.accessToken, sessionData);
|
|
171
|
+
if (session) {
|
|
172
|
+
console.log(`[vibe-sessions] Created session for ${input.email} from ${input.ipAddress}`);
|
|
173
|
+
}
|
|
174
|
+
return session;
|
|
175
|
+
}
|
|
176
|
+
// -----------------------------------------------------------------------------
|
|
177
|
+
// GET SESSIONS
|
|
178
|
+
// -----------------------------------------------------------------------------
|
|
179
|
+
/**
|
|
180
|
+
* Get all sessions for a specific user.
|
|
181
|
+
*
|
|
182
|
+
* @param idpUserId - The user's IDP ID
|
|
183
|
+
* @param accessToken - User's access token for auth
|
|
184
|
+
* @returns Array of sessions
|
|
185
|
+
*/
|
|
186
|
+
async function getUserSessions(idpUserId, accessToken) {
|
|
187
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}/query`;
|
|
188
|
+
const result = await vibeProxyRequest(endpoint, 'POST', accessToken, {
|
|
189
|
+
filter: [{ field: 'idp_user_id', operator: 'eq', value: idpUserId }],
|
|
190
|
+
pageSize: 100,
|
|
191
|
+
});
|
|
192
|
+
return result?.data || result?.items || [];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get all sessions (admin only).
|
|
196
|
+
* Returns sessions from all users, sorted by most recent first.
|
|
197
|
+
*
|
|
198
|
+
* @param options - Query options
|
|
199
|
+
* @param accessToken - Admin's access token
|
|
200
|
+
* @returns Array of sessions with total count
|
|
201
|
+
*/
|
|
202
|
+
async function getAllSessions(options = {}, accessToken) {
|
|
203
|
+
const page = options.page || 1;
|
|
204
|
+
const pageSize = options.pageSize || 50;
|
|
205
|
+
const query = {
|
|
206
|
+
page,
|
|
207
|
+
pageSize,
|
|
208
|
+
orderBy: 'created_at',
|
|
209
|
+
orderDir: 'desc',
|
|
210
|
+
};
|
|
211
|
+
if (options.status) {
|
|
212
|
+
query.filter = [{ field: 'status', operator: 'eq', value: options.status }];
|
|
213
|
+
}
|
|
214
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}/query`;
|
|
215
|
+
const result = await vibeProxyRequest(endpoint, 'POST', accessToken, query);
|
|
216
|
+
const sessions = result?.data || result?.items || [];
|
|
217
|
+
const total = result?.meta?.total ?? result?.meta?.totalCount ?? result?.totalCount ?? sessions.length;
|
|
218
|
+
return { sessions, total };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get a single session by ID.
|
|
222
|
+
*
|
|
223
|
+
* @param sessionId - The session document ID
|
|
224
|
+
* @param accessToken - Access token for auth
|
|
225
|
+
*/
|
|
226
|
+
async function getSessionById(sessionId, accessToken) {
|
|
227
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}/${sessionId}`;
|
|
228
|
+
return vibeProxyRequest(endpoint, 'GET', accessToken);
|
|
229
|
+
}
|
|
230
|
+
// -----------------------------------------------------------------------------
|
|
231
|
+
// REVOKE SESSION
|
|
232
|
+
// -----------------------------------------------------------------------------
|
|
233
|
+
/**
|
|
234
|
+
* Revoke a specific session.
|
|
235
|
+
* The user will be logged out on their next request.
|
|
236
|
+
*
|
|
237
|
+
* @param sessionId - The session document ID
|
|
238
|
+
* @param adminEmail - Email of the admin performing the revocation
|
|
239
|
+
* @param accessToken - Admin's access token
|
|
240
|
+
* @param reason - Optional reason for revocation
|
|
241
|
+
* @returns The updated session, or null on failure
|
|
242
|
+
*/
|
|
243
|
+
async function revokeSession(sessionId, adminEmail, accessToken, reason) {
|
|
244
|
+
const now = new Date().toISOString();
|
|
245
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}/${sessionId}`;
|
|
246
|
+
const session = await vibeProxyRequest(endpoint, 'PUT', accessToken, {
|
|
247
|
+
status: 'revoked',
|
|
248
|
+
revoked_by: adminEmail,
|
|
249
|
+
revoked_at: now,
|
|
250
|
+
revoke_reason: reason || 'Revoked by administrator',
|
|
251
|
+
});
|
|
252
|
+
if (session) {
|
|
253
|
+
console.log(`[vibe-sessions] Session ${sessionId} revoked by ${adminEmail}`);
|
|
254
|
+
}
|
|
255
|
+
return session;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Revoke all sessions for a specific user.
|
|
259
|
+
* Useful when an account is compromised.
|
|
260
|
+
*
|
|
261
|
+
* @param idpUserId - The user's IDP ID
|
|
262
|
+
* @param adminEmail - Email of the admin performing the revocation
|
|
263
|
+
* @param accessToken - Admin's access token
|
|
264
|
+
* @param reason - Optional reason for revocation
|
|
265
|
+
* @returns Number of sessions revoked
|
|
266
|
+
*/
|
|
267
|
+
async function revokeAllUserSessions(idpUserId, adminEmail, accessToken, reason) {
|
|
268
|
+
const sessions = await getUserSessions(idpUserId, accessToken);
|
|
269
|
+
const activeSessions = sessions.filter(s => s.status === 'active');
|
|
270
|
+
let revokedCount = 0;
|
|
271
|
+
for (const session of activeSessions) {
|
|
272
|
+
const result = await revokeSession(session.id, adminEmail, accessToken, reason);
|
|
273
|
+
if (result)
|
|
274
|
+
revokedCount++;
|
|
275
|
+
}
|
|
276
|
+
console.log(`[vibe-sessions] Revoked ${revokedCount} sessions for user ${idpUserId}`);
|
|
277
|
+
return revokedCount;
|
|
278
|
+
}
|
|
279
|
+
// -----------------------------------------------------------------------------
|
|
280
|
+
// UPDATE ACTIVITY
|
|
281
|
+
// -----------------------------------------------------------------------------
|
|
282
|
+
/**
|
|
283
|
+
* Update the last_activity timestamp for a session.
|
|
284
|
+
* Call this periodically during user activity.
|
|
285
|
+
*
|
|
286
|
+
* @param sessionId - The session document ID
|
|
287
|
+
* @param accessToken - Access token for auth
|
|
288
|
+
* @returns true if updated successfully
|
|
289
|
+
*/
|
|
290
|
+
async function updateSessionActivity(sessionId, accessToken) {
|
|
291
|
+
const endpoint = `/v1/collections/${COLLECTION}/tables/${TABLE}/${sessionId}`;
|
|
292
|
+
const result = await vibeProxyRequest(endpoint, 'PUT', accessToken, { last_activity: new Date().toISOString() });
|
|
293
|
+
return result !== null;
|
|
294
|
+
}
|
|
295
|
+
// -----------------------------------------------------------------------------
|
|
296
|
+
// CHECK SESSION STATUS
|
|
297
|
+
// -----------------------------------------------------------------------------
|
|
298
|
+
/**
|
|
299
|
+
* Check if a session is still valid (not revoked/expired).
|
|
300
|
+
* Use this in middleware to enforce session revocation.
|
|
301
|
+
*
|
|
302
|
+
* @param sessionId - The session document ID
|
|
303
|
+
* @param accessToken - Access token for auth
|
|
304
|
+
* @returns true if session is active and not expired
|
|
305
|
+
*/
|
|
306
|
+
async function isSessionValid(sessionId, accessToken) {
|
|
307
|
+
const session = await getSessionById(sessionId, accessToken);
|
|
308
|
+
if (!session)
|
|
309
|
+
return false;
|
|
310
|
+
if (session.status !== 'active')
|
|
311
|
+
return false;
|
|
312
|
+
// Check expiry
|
|
313
|
+
const expiresAt = new Date(session.expires_at);
|
|
314
|
+
if (expiresAt < new Date()) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Check if a user has any revoked sessions that need enforcement.
|
|
321
|
+
* Returns the most recently revoked session if found.
|
|
322
|
+
*
|
|
323
|
+
* @param idpUserId - The user's IDP ID
|
|
324
|
+
* @param accessToken - Access token for auth
|
|
325
|
+
* @param sessionTokenHash - Optional token hash to check specific session
|
|
326
|
+
* @returns Revoked session info if enforcement needed, null otherwise
|
|
327
|
+
*/
|
|
328
|
+
async function checkSessionRevocation(idpUserId, accessToken, sessionTokenHash) {
|
|
329
|
+
const sessions = await getUserSessions(idpUserId, accessToken);
|
|
330
|
+
// If we have a specific token hash, check that session
|
|
331
|
+
if (sessionTokenHash) {
|
|
332
|
+
const matchingSession = sessions.find(s => s.session_token_hash === sessionTokenHash);
|
|
333
|
+
if (matchingSession && matchingSession.status === 'revoked') {
|
|
334
|
+
return matchingSession;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Otherwise, check if there are any recently revoked sessions
|
|
338
|
+
// (revoked within the last hour - gives time for enforcement)
|
|
339
|
+
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
|
340
|
+
const recentlyRevoked = sessions.find(s => s.status === 'revoked' &&
|
|
341
|
+
s.revoked_at &&
|
|
342
|
+
new Date(s.revoked_at) > oneHourAgo);
|
|
343
|
+
return recentlyRevoked || null;
|
|
344
|
+
}
|
|
345
|
+
// -----------------------------------------------------------------------------
|
|
346
|
+
// STATISTICS
|
|
347
|
+
// -----------------------------------------------------------------------------
|
|
348
|
+
/**
|
|
349
|
+
* Get session statistics for admin dashboard.
|
|
350
|
+
*
|
|
351
|
+
* @param accessToken - Admin's access token
|
|
352
|
+
*/
|
|
353
|
+
async function getSessionStats(accessToken) {
|
|
354
|
+
const { sessions } = await getAllSessions({ pageSize: 1000 }, accessToken);
|
|
355
|
+
const stats = {
|
|
356
|
+
totalActive: 0,
|
|
357
|
+
totalRevoked: 0,
|
|
358
|
+
uniqueUsers: new Set(),
|
|
359
|
+
byCountry: {},
|
|
360
|
+
byDevice: {},
|
|
361
|
+
recentLogins: 0,
|
|
362
|
+
};
|
|
363
|
+
const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
364
|
+
for (const session of sessions) {
|
|
365
|
+
// Status counts
|
|
366
|
+
if (session.status === 'active')
|
|
367
|
+
stats.totalActive++;
|
|
368
|
+
if (session.status === 'revoked')
|
|
369
|
+
stats.totalRevoked++;
|
|
370
|
+
// Unique users
|
|
371
|
+
stats.uniqueUsers.add(session.idp_user_id);
|
|
372
|
+
// By country
|
|
373
|
+
const country = session.country_code || 'Unknown';
|
|
374
|
+
stats.byCountry[country] = (stats.byCountry[country] || 0) + 1;
|
|
375
|
+
// By device type
|
|
376
|
+
const device = session.device_type || 'unknown';
|
|
377
|
+
stats.byDevice[device] = (stats.byDevice[device] || 0) + 1;
|
|
378
|
+
// Recent logins
|
|
379
|
+
if (new Date(session.created_at) > oneDayAgo) {
|
|
380
|
+
stats.recentLogins++;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
totalActive: stats.totalActive,
|
|
385
|
+
totalRevoked: stats.totalRevoked,
|
|
386
|
+
uniqueUsers: stats.uniqueUsers.size,
|
|
387
|
+
byCountry: stats.byCountry,
|
|
388
|
+
byDevice: stats.byDevice,
|
|
389
|
+
recentLogins: stats.recentLogins,
|
|
390
|
+
};
|
|
391
|
+
}
|