@payez/next-mvp 3.9.1 → 4.0.1

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.
Files changed (526) hide show
  1. package/package.json +6 -18
  2. package/src/api/auth-handler.ts +550 -549
  3. package/src/api-handlers/account/change-password.ts +5 -8
  4. package/src/api-handlers/admin/analytics.ts +4 -6
  5. package/src/api-handlers/admin/audit.ts +5 -7
  6. package/src/api-handlers/admin/index.ts +1 -2
  7. package/src/api-handlers/admin/redis-sessions.ts +6 -8
  8. package/src/api-handlers/admin/sessions.ts +5 -7
  9. package/src/api-handlers/admin/site-logs.ts +8 -10
  10. package/src/api-handlers/admin/stats.ts +4 -6
  11. package/src/api-handlers/admin/users.ts +5 -7
  12. package/src/api-handlers/admin/vibe-data.ts +10 -12
  13. package/src/api-handlers/auth/refresh.ts +5 -7
  14. package/src/api-handlers/auth/signout.ts +5 -6
  15. package/src/api-handlers/auth/status.ts +4 -7
  16. package/src/api-handlers/auth/update-session.ts +123 -125
  17. package/src/api-handlers/auth/verify-code.ts +9 -13
  18. package/src/api-handlers/session/viability.ts +10 -47
  19. package/src/api-handlers/test/force-expire.ts +4 -11
  20. package/src/auth/auth-decision.ts +1 -1
  21. package/src/auth/better-auth.ts +138 -141
  22. package/src/auth/route-config.ts +219 -219
  23. package/src/auth/utils/token-utils.ts +0 -1
  24. package/src/client/AuthContext.tsx +6 -2
  25. package/src/client/fetch-with-auth.ts +47 -47
  26. package/src/components/SessionSync.tsx +6 -5
  27. package/src/components/account/MobileNavDrawer.tsx +3 -3
  28. package/src/components/account/UserAvatarMenu.tsx +6 -3
  29. package/src/components/admin/VibeAdminLayout.tsx +4 -2
  30. package/src/config/logger.ts +1 -1
  31. package/src/hooks/useAuth.ts +117 -115
  32. package/src/hooks/useAuthSettings.ts +2 -2
  33. package/src/hooks/useAvailableProviders.ts +9 -5
  34. package/src/hooks/useSessionExpiration.ts +101 -102
  35. package/src/hooks/useViabilitySession.ts +336 -335
  36. package/src/index.ts +60 -63
  37. package/src/lib/api-handler.ts +0 -1
  38. package/src/lib/app-slug.ts +6 -6
  39. package/src/lib/standardized-client-api.ts +901 -895
  40. package/src/lib/startup-init.ts +243 -247
  41. package/src/lib/test-aware-get-token.ts +22 -12
  42. package/src/lib/token-lifecycle.ts +12 -53
  43. package/src/pages/admin-login/page.tsx +9 -17
  44. package/src/pages/client-admin/ClientSiteAdminPage.tsx +4 -2
  45. package/src/pages/login/page.tsx +21 -28
  46. package/src/pages/showcase/ShowcasePage.tsx +4 -2
  47. package/src/pages/test-env/EmergencyLogoutPage.tsx +7 -6
  48. package/src/pages/test-env/JwtInspectPage.tsx +5 -3
  49. package/src/pages/test-env/RefreshTokenPage.tsx +157 -155
  50. package/src/pages/test-env/TestEnvPage.tsx +4 -2
  51. package/src/pages/verify-code/page.tsx +10 -6
  52. package/src/routes/auth/logout.ts +7 -25
  53. package/src/routes/auth/nextauth.ts +45 -71
  54. package/src/routes/auth/session.ts +25 -50
  55. package/src/routes/auth/viability.ts +7 -19
  56. package/src/server/auth.ts +60 -0
  57. package/src/stores/authStore.ts +1899 -1904
  58. package/src/utils/logout.ts +30 -30
  59. package/dist/api/auth-handler.d.ts +0 -67
  60. package/dist/api/auth-handler.js +0 -397
  61. package/dist/api/index.d.ts +0 -10
  62. package/dist/api/index.js +0 -19
  63. package/dist/api-handlers/account/change-password.d.ts +0 -9
  64. package/dist/api-handlers/account/change-password.js +0 -112
  65. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  66. package/dist/api-handlers/account/masked-info.js +0 -41
  67. package/dist/api-handlers/account/profile.d.ts +0 -3
  68. package/dist/api-handlers/account/profile.js +0 -63
  69. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  70. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  71. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  72. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  73. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  74. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  75. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  76. package/dist/api-handlers/account/reset-password.js +0 -26
  77. package/dist/api-handlers/account/send-code.d.ts +0 -24
  78. package/dist/api-handlers/account/send-code.js +0 -60
  79. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  80. package/dist/api-handlers/account/update-phone.js +0 -64
  81. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  82. package/dist/api-handlers/account/validate-password.js +0 -81
  83. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  84. package/dist/api-handlers/account/verify-email.js +0 -106
  85. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  86. package/dist/api-handlers/account/verify-sms.js +0 -106
  87. package/dist/api-handlers/admin/analytics.d.ts +0 -20
  88. package/dist/api-handlers/admin/analytics.js +0 -379
  89. package/dist/api-handlers/admin/audit.d.ts +0 -20
  90. package/dist/api-handlers/admin/audit.js +0 -214
  91. package/dist/api-handlers/admin/index.d.ts +0 -22
  92. package/dist/api-handlers/admin/index.js +0 -43
  93. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -36
  94. package/dist/api-handlers/admin/redis-sessions.js +0 -204
  95. package/dist/api-handlers/admin/sessions.d.ts +0 -21
  96. package/dist/api-handlers/admin/sessions.js +0 -284
  97. package/dist/api-handlers/admin/site-logs.d.ts +0 -46
  98. package/dist/api-handlers/admin/site-logs.js +0 -318
  99. package/dist/api-handlers/admin/stats.d.ts +0 -21
  100. package/dist/api-handlers/admin/stats.js +0 -240
  101. package/dist/api-handlers/admin/users.d.ts +0 -20
  102. package/dist/api-handlers/admin/users.js +0 -222
  103. package/dist/api-handlers/admin/vibe-data.d.ts +0 -80
  104. package/dist/api-handlers/admin/vibe-data.js +0 -268
  105. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  106. package/dist/api-handlers/anon/preferences.js +0 -96
  107. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  108. package/dist/api-handlers/auth/jwks.js +0 -24
  109. package/dist/api-handlers/auth/login.d.ts +0 -42
  110. package/dist/api-handlers/auth/login.js +0 -178
  111. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  112. package/dist/api-handlers/auth/refresh.js +0 -635
  113. package/dist/api-handlers/auth/signout.d.ts +0 -37
  114. package/dist/api-handlers/auth/signout.js +0 -187
  115. package/dist/api-handlers/auth/status.d.ts +0 -8
  116. package/dist/api-handlers/auth/status.js +0 -26
  117. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  118. package/dist/api-handlers/auth/update-session.js +0 -95
  119. package/dist/api-handlers/auth/validate.d.ts +0 -6
  120. package/dist/api-handlers/auth/validate.js +0 -43
  121. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  122. package/dist/api-handlers/auth/verify-code.js +0 -94
  123. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  124. package/dist/api-handlers/session/refresh-viability.js +0 -39
  125. package/dist/api-handlers/session/viability.d.ts +0 -13
  126. package/dist/api-handlers/session/viability.js +0 -146
  127. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  128. package/dist/api-handlers/test/force-expire.js +0 -65
  129. package/dist/auth/auth-decision.d.ts +0 -39
  130. package/dist/auth/auth-decision.js +0 -182
  131. package/dist/auth/auth-options.d.ts +0 -57
  132. package/dist/auth/auth-options.js +0 -213
  133. package/dist/auth/better-auth.d.ts +0 -82
  134. package/dist/auth/better-auth.js +0 -122
  135. package/dist/auth/callbacks/index.d.ts +0 -6
  136. package/dist/auth/callbacks/index.js +0 -12
  137. package/dist/auth/callbacks/jwt.d.ts +0 -45
  138. package/dist/auth/callbacks/jwt.js +0 -305
  139. package/dist/auth/callbacks/session.d.ts +0 -60
  140. package/dist/auth/callbacks/session.js +0 -170
  141. package/dist/auth/callbacks/signin.d.ts +0 -23
  142. package/dist/auth/callbacks/signin.js +0 -44
  143. package/dist/auth/events/index.d.ts +0 -4
  144. package/dist/auth/events/index.js +0 -8
  145. package/dist/auth/events/signout.d.ts +0 -17
  146. package/dist/auth/events/signout.js +0 -32
  147. package/dist/auth/providers/credentials.d.ts +0 -32
  148. package/dist/auth/providers/credentials.js +0 -223
  149. package/dist/auth/providers/index.d.ts +0 -5
  150. package/dist/auth/providers/index.js +0 -21
  151. package/dist/auth/providers/oauth.d.ts +0 -26
  152. package/dist/auth/providers/oauth.js +0 -105
  153. package/dist/auth/route-config.d.ts +0 -66
  154. package/dist/auth/route-config.js +0 -190
  155. package/dist/auth/types/auth-types.d.ts +0 -417
  156. package/dist/auth/types/auth-types.js +0 -53
  157. package/dist/auth/types/index.d.ts +0 -6
  158. package/dist/auth/types/index.js +0 -22
  159. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  160. package/dist/auth/unauthenticated-routes.js +0 -19
  161. package/dist/auth/utils/idp-client.d.ts +0 -94
  162. package/dist/auth/utils/idp-client.js +0 -384
  163. package/dist/auth/utils/index.d.ts +0 -5
  164. package/dist/auth/utils/index.js +0 -21
  165. package/dist/auth/utils/token-utils.d.ts +0 -84
  166. package/dist/auth/utils/token-utils.js +0 -219
  167. package/dist/client/AuthContext.d.ts +0 -19
  168. package/dist/client/AuthContext.js +0 -112
  169. package/dist/client/better-auth-client.d.ts +0 -1020
  170. package/dist/client/better-auth-client.js +0 -68
  171. package/dist/client/fetch-with-auth.d.ts +0 -11
  172. package/dist/client/fetch-with-auth.js +0 -44
  173. package/dist/client/fetchWithSession.d.ts +0 -3
  174. package/dist/client/fetchWithSession.js +0 -24
  175. package/dist/client/index.d.ts +0 -9
  176. package/dist/client/index.js +0 -20
  177. package/dist/client/useAnonSession.d.ts +0 -36
  178. package/dist/client/useAnonSession.js +0 -99
  179. package/dist/components/SessionSync.d.ts +0 -13
  180. package/dist/components/SessionSync.js +0 -119
  181. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  182. package/dist/components/SignalRHealthCheck.js +0 -97
  183. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  184. package/dist/components/account/MobileNavDrawer.js +0 -81
  185. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  186. package/dist/components/account/UserAvatarMenu.js +0 -88
  187. package/dist/components/account/index.d.ts +0 -9
  188. package/dist/components/account/index.js +0 -13
  189. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  190. package/dist/components/admin/AlertSettingsTab.js +0 -351
  191. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  192. package/dist/components/admin/AnalyticsTab.js +0 -167
  193. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  194. package/dist/components/admin/DataBrowserTab.js +0 -252
  195. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  196. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  197. package/dist/components/admin/SessionsTab.d.ts +0 -37
  198. package/dist/components/admin/SessionsTab.js +0 -165
  199. package/dist/components/admin/StatsTab.d.ts +0 -53
  200. package/dist/components/admin/StatsTab.js +0 -161
  201. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  202. package/dist/components/admin/VibeAdminContext.js +0 -38
  203. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  204. package/dist/components/admin/VibeAdminLayout.js +0 -69
  205. package/dist/components/admin/index.d.ts +0 -29
  206. package/dist/components/admin/index.js +0 -44
  207. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  208. package/dist/components/auth/FederatedAuthSection.js +0 -45
  209. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  210. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  211. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  212. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  213. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  214. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  215. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  216. package/dist/components/recovery/CompleteStep.js +0 -8
  217. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  218. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  219. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  220. package/dist/components/recovery/SelectMethodStep.js +0 -8
  221. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  222. package/dist/components/recovery/SetPasswordStep.js +0 -20
  223. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  224. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  225. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  226. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  227. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  228. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  229. package/dist/components/ui/BetaBadge.d.ts +0 -29
  230. package/dist/components/ui/BetaBadge.js +0 -38
  231. package/dist/components/ui/Footer.d.ts +0 -37
  232. package/dist/components/ui/Footer.js +0 -41
  233. package/dist/config/env.d.ts +0 -66
  234. package/dist/config/env.js +0 -57
  235. package/dist/config/logger.d.ts +0 -57
  236. package/dist/config/logger.js +0 -73
  237. package/dist/config/logging-config.d.ts +0 -30
  238. package/dist/config/logging-config.js +0 -122
  239. package/dist/config/unauthenticated-routes.d.ts +0 -17
  240. package/dist/config/unauthenticated-routes.js +0 -24
  241. package/dist/config/vibe-log-transport.d.ts +0 -81
  242. package/dist/config/vibe-log-transport.js +0 -212
  243. package/dist/edge/internal-api-url.d.ts +0 -53
  244. package/dist/edge/internal-api-url.js +0 -63
  245. package/dist/edge/middleware.d.ts +0 -14
  246. package/dist/edge/middleware.js +0 -32
  247. package/dist/hooks/useAuth.d.ts +0 -23
  248. package/dist/hooks/useAuth.js +0 -81
  249. package/dist/hooks/useAuthSettings.d.ts +0 -59
  250. package/dist/hooks/useAuthSettings.js +0 -93
  251. package/dist/hooks/useAvailableProviders.d.ts +0 -45
  252. package/dist/hooks/useAvailableProviders.js +0 -108
  253. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  254. package/dist/hooks/usePasswordValidation.js +0 -102
  255. package/dist/hooks/useProfile.d.ts +0 -15
  256. package/dist/hooks/useProfile.js +0 -59
  257. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  258. package/dist/hooks/usePublicAuthSettings.js +0 -131
  259. package/dist/hooks/useSessionExpiration.d.ts +0 -57
  260. package/dist/hooks/useSessionExpiration.js +0 -72
  261. package/dist/hooks/useViabilitySession.d.ts +0 -75
  262. package/dist/hooks/useViabilitySession.js +0 -268
  263. package/dist/index.d.ts +0 -12
  264. package/dist/index.js +0 -55
  265. package/dist/lib/anon-session.d.ts +0 -74
  266. package/dist/lib/anon-session.js +0 -169
  267. package/dist/lib/api-handler.d.ts +0 -123
  268. package/dist/lib/api-handler.js +0 -478
  269. package/dist/lib/app-slug.d.ts +0 -95
  270. package/dist/lib/app-slug.js +0 -172
  271. package/dist/lib/demo-mode.d.ts +0 -6
  272. package/dist/lib/demo-mode.js +0 -16
  273. package/dist/lib/geolocation.d.ts +0 -64
  274. package/dist/lib/geolocation.js +0 -235
  275. package/dist/lib/idp-client-config.d.ts +0 -75
  276. package/dist/lib/idp-client-config.js +0 -425
  277. package/dist/lib/idp-fetch.d.ts +0 -14
  278. package/dist/lib/idp-fetch.js +0 -91
  279. package/dist/lib/internal-api.d.ts +0 -87
  280. package/dist/lib/internal-api.js +0 -122
  281. package/dist/lib/jwt-decode-client.d.ts +0 -10
  282. package/dist/lib/jwt-decode-client.js +0 -46
  283. package/dist/lib/jwt-decode.d.ts +0 -48
  284. package/dist/lib/jwt-decode.js +0 -57
  285. package/dist/lib/nextauth-secret.d.ts +0 -10
  286. package/dist/lib/nextauth-secret.js +0 -100
  287. package/dist/lib/rate-limit-service.d.ts +0 -23
  288. package/dist/lib/rate-limit-service.js +0 -6
  289. package/dist/lib/redis.d.ts +0 -5
  290. package/dist/lib/redis.js +0 -28
  291. package/dist/lib/refresh-token-validator.d.ts +0 -13
  292. package/dist/lib/refresh-token-validator.js +0 -117
  293. package/dist/lib/roles.d.ts +0 -145
  294. package/dist/lib/roles.js +0 -168
  295. package/dist/lib/secret-validation.d.ts +0 -4
  296. package/dist/lib/secret-validation.js +0 -14
  297. package/dist/lib/session-store.d.ts +0 -170
  298. package/dist/lib/session-store.js +0 -545
  299. package/dist/lib/session.d.ts +0 -21
  300. package/dist/lib/session.js +0 -26
  301. package/dist/lib/site-logger.d.ts +0 -214
  302. package/dist/lib/site-logger.js +0 -210
  303. package/dist/lib/standardized-client-api.d.ts +0 -161
  304. package/dist/lib/standardized-client-api.js +0 -786
  305. package/dist/lib/startup-init.d.ts +0 -40
  306. package/dist/lib/startup-init.js +0 -261
  307. package/dist/lib/test-aware-get-token.d.ts +0 -2
  308. package/dist/lib/test-aware-get-token.js +0 -81
  309. package/dist/lib/token-expiry.d.ts +0 -14
  310. package/dist/lib/token-expiry.js +0 -39
  311. package/dist/lib/token-lifecycle.d.ts +0 -52
  312. package/dist/lib/token-lifecycle.js +0 -398
  313. package/dist/lib/types/api-responses.d.ts +0 -128
  314. package/dist/lib/types/api-responses.js +0 -171
  315. package/dist/lib/user-agent-parser.d.ts +0 -50
  316. package/dist/lib/user-agent-parser.js +0 -220
  317. package/dist/logging/api/admin-analytics.d.ts +0 -3
  318. package/dist/logging/api/admin-analytics.js +0 -45
  319. package/dist/logging/api/audit-log.d.ts +0 -3
  320. package/dist/logging/api/audit-log.js +0 -52
  321. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  322. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  323. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  324. package/dist/logging/components/AuditLogViewer.js +0 -51
  325. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  326. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  327. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  328. package/dist/logging/components/HealthMetricsCard.js +0 -19
  329. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  330. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  331. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  332. package/dist/logging/hooks/useAuditLog.js +0 -25
  333. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  334. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  335. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  336. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  337. package/dist/logging/index.d.ts +0 -11
  338. package/dist/logging/index.js +0 -40
  339. package/dist/logging/types/analytics.d.ts +0 -68
  340. package/dist/logging/types/analytics.js +0 -3
  341. package/dist/logging/types/audit.d.ts +0 -29
  342. package/dist/logging/types/audit.js +0 -2
  343. package/dist/logging/types/index.d.ts +0 -2
  344. package/dist/logging/types/index.js +0 -19
  345. package/dist/middleware/auth-decision.d.ts +0 -33
  346. package/dist/middleware/auth-decision.js +0 -65
  347. package/dist/middleware/create-middleware.d.ts +0 -102
  348. package/dist/middleware/create-middleware.js +0 -469
  349. package/dist/middleware/rbac-check.d.ts +0 -51
  350. package/dist/middleware/rbac-check.js +0 -219
  351. package/dist/middleware/twofa-presets.d.ts +0 -134
  352. package/dist/middleware/twofa-presets.js +0 -175
  353. package/dist/models/DecodedAccessToken.d.ts +0 -17
  354. package/dist/models/DecodedAccessToken.js +0 -2
  355. package/dist/models/SessionModel.d.ts +0 -122
  356. package/dist/models/SessionModel.js +0 -136
  357. package/dist/pages/admin-login/page.d.ts +0 -31
  358. package/dist/pages/admin-login/page.js +0 -83
  359. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  360. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  361. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  362. package/dist/pages/admin-page-permissions/index.js +0 -13
  363. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  364. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  365. package/dist/pages/admin-roles/index.d.ts +0 -8
  366. package/dist/pages/admin-roles/index.js +0 -15
  367. package/dist/pages/admin-roles/modals.d.ts +0 -72
  368. package/dist/pages/admin-roles/modals.js +0 -154
  369. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  370. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -177
  371. package/dist/pages/client-admin/index.d.ts +0 -32
  372. package/dist/pages/client-admin/index.js +0 -37
  373. package/dist/pages/coming-soon/page.d.ts +0 -8
  374. package/dist/pages/coming-soon/page.js +0 -28
  375. package/dist/pages/login/page.d.ts +0 -22
  376. package/dist/pages/login/page.js +0 -239
  377. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  378. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  379. package/dist/pages/profile/index.d.ts +0 -8
  380. package/dist/pages/profile/index.js +0 -16
  381. package/dist/pages/profile/page.d.ts +0 -19
  382. package/dist/pages/profile/page.js +0 -47
  383. package/dist/pages/profile/profile-patch.d.ts +0 -1
  384. package/dist/pages/profile/profile-patch.js +0 -281
  385. package/dist/pages/recovery/page.d.ts +0 -1
  386. package/dist/pages/recovery/page.js +0 -142
  387. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  388. package/dist/pages/roles/MyRolesPage.js +0 -71
  389. package/dist/pages/roles/components.d.ts +0 -63
  390. package/dist/pages/roles/components.js +0 -108
  391. package/dist/pages/roles/index.d.ts +0 -8
  392. package/dist/pages/roles/index.js +0 -19
  393. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  394. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  395. package/dist/pages/security/index.d.ts +0 -8
  396. package/dist/pages/security/index.js +0 -16
  397. package/dist/pages/security/page.d.ts +0 -21
  398. package/dist/pages/security/page.js +0 -212
  399. package/dist/pages/security/security-patch.d.ts +0 -1
  400. package/dist/pages/security/security-patch.js +0 -302
  401. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  402. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  403. package/dist/pages/settings/index.d.ts +0 -8
  404. package/dist/pages/settings/index.js +0 -16
  405. package/dist/pages/settings/page.d.ts +0 -7
  406. package/dist/pages/settings/page.js +0 -26
  407. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  408. package/dist/pages/showcase/ShowcasePage.js +0 -140
  409. package/dist/pages/showcase/index.d.ts +0 -12
  410. package/dist/pages/showcase/index.js +0 -17
  411. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  412. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -98
  413. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  414. package/dist/pages/test-env/JwtInspectPage.js +0 -114
  415. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  416. package/dist/pages/test-env/RefreshTokenPage.js +0 -91
  417. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  418. package/dist/pages/test-env/TestEnvPage.js +0 -49
  419. package/dist/pages/test-env/index.d.ts +0 -24
  420. package/dist/pages/test-env/index.js +0 -32
  421. package/dist/pages/verify-code/page.d.ts +0 -30
  422. package/dist/pages/verify-code/page.js +0 -408
  423. package/dist/routes/account/index.d.ts +0 -28
  424. package/dist/routes/account/index.js +0 -71
  425. package/dist/routes/account/masked-info.d.ts +0 -33
  426. package/dist/routes/account/masked-info.js +0 -39
  427. package/dist/routes/account/send-code.d.ts +0 -37
  428. package/dist/routes/account/send-code.js +0 -42
  429. package/dist/routes/account/update-phone.d.ts +0 -13
  430. package/dist/routes/account/update-phone.js +0 -17
  431. package/dist/routes/account/verify-email.d.ts +0 -38
  432. package/dist/routes/account/verify-email.js +0 -43
  433. package/dist/routes/account/verify-sms.d.ts +0 -38
  434. package/dist/routes/account/verify-sms.js +0 -43
  435. package/dist/routes/auth/index.d.ts +0 -19
  436. package/dist/routes/auth/index.js +0 -64
  437. package/dist/routes/auth/logout.d.ts +0 -31
  438. package/dist/routes/auth/logout.js +0 -113
  439. package/dist/routes/auth/nextauth.d.ts +0 -19
  440. package/dist/routes/auth/nextauth.js +0 -72
  441. package/dist/routes/auth/refresh.d.ts +0 -30
  442. package/dist/routes/auth/refresh.js +0 -51
  443. package/dist/routes/auth/session.d.ts +0 -43
  444. package/dist/routes/auth/session.js +0 -179
  445. package/dist/routes/auth/settings.d.ts +0 -25
  446. package/dist/routes/auth/settings.js +0 -55
  447. package/dist/routes/auth/viability.d.ts +0 -52
  448. package/dist/routes/auth/viability.js +0 -201
  449. package/dist/routes/index.d.ts +0 -12
  450. package/dist/routes/index.js +0 -54
  451. package/dist/routes/session/index.d.ts +0 -6
  452. package/dist/routes/session/index.js +0 -10
  453. package/dist/routes/session/refresh-viability.d.ts +0 -16
  454. package/dist/routes/session/refresh-viability.js +0 -20
  455. package/dist/server/auth-guard.d.ts +0 -46
  456. package/dist/server/auth-guard.js +0 -128
  457. package/dist/server/decode-session.d.ts +0 -30
  458. package/dist/server/decode-session.js +0 -78
  459. package/dist/server/slim-middleware.d.ts +0 -23
  460. package/dist/server/slim-middleware.js +0 -89
  461. package/dist/server/with-auth.d.ts +0 -33
  462. package/dist/server/with-auth.js +0 -59
  463. package/dist/services/signalrActivityService.d.ts +0 -44
  464. package/dist/services/signalrActivityService.js +0 -257
  465. package/dist/stores/authStore.d.ts +0 -154
  466. package/dist/stores/authStore.js +0 -1531
  467. package/dist/theme/ThemeProvider.d.ts +0 -14
  468. package/dist/theme/ThemeProvider.js +0 -28
  469. package/dist/theme/default.d.ts +0 -8
  470. package/dist/theme/default.js +0 -33
  471. package/dist/theme/index.d.ts +0 -15
  472. package/dist/theme/index.js +0 -25
  473. package/dist/theme/types.d.ts +0 -56
  474. package/dist/theme/types.js +0 -8
  475. package/dist/theme/useTheme.d.ts +0 -60
  476. package/dist/theme/useTheme.js +0 -63
  477. package/dist/theme/utils.d.ts +0 -13
  478. package/dist/theme/utils.js +0 -39
  479. package/dist/types/api.d.ts +0 -134
  480. package/dist/types/api.js +0 -44
  481. package/dist/types/auth.d.ts +0 -19
  482. package/dist/types/auth.js +0 -2
  483. package/dist/types/logging.d.ts +0 -42
  484. package/dist/types/logging.js +0 -2
  485. package/dist/types/recovery.d.ts +0 -48
  486. package/dist/types/recovery.js +0 -2
  487. package/dist/types/security.d.ts +0 -1
  488. package/dist/types/security.js +0 -2
  489. package/dist/utils/api.d.ts +0 -85
  490. package/dist/utils/api.js +0 -287
  491. package/dist/utils/circuitBreaker.d.ts +0 -43
  492. package/dist/utils/circuitBreaker.js +0 -91
  493. package/dist/utils/error-message.d.ts +0 -1
  494. package/dist/utils/error-message.js +0 -103
  495. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  496. package/dist/utils/layout/reservedSpace.js +0 -102
  497. package/dist/utils/logout.d.ts +0 -14
  498. package/dist/utils/logout.js +0 -32
  499. package/dist/vibe/client.d.ts +0 -261
  500. package/dist/vibe/client.js +0 -445
  501. package/dist/vibe/enterprise-auth.d.ts +0 -106
  502. package/dist/vibe/enterprise-auth.js +0 -173
  503. package/dist/vibe/errors.d.ts +0 -83
  504. package/dist/vibe/errors.js +0 -146
  505. package/dist/vibe/generic.d.ts +0 -234
  506. package/dist/vibe/generic.js +0 -369
  507. package/dist/vibe/hooks/index.d.ts +0 -169
  508. package/dist/vibe/hooks/index.js +0 -252
  509. package/dist/vibe/index.d.ts +0 -25
  510. package/dist/vibe/index.js +0 -72
  511. package/dist/vibe/sessions.d.ts +0 -161
  512. package/dist/vibe/sessions.js +0 -391
  513. package/dist/vibe/types.d.ts +0 -353
  514. package/dist/vibe/types.js +0 -315
  515. package/src/auth/auth-options.ts +0 -237
  516. package/src/auth/callbacks/index.ts +0 -7
  517. package/src/auth/callbacks/jwt.ts +0 -382
  518. package/src/auth/callbacks/session.ts +0 -243
  519. package/src/auth/callbacks/signin.ts +0 -56
  520. package/src/auth/events/index.ts +0 -5
  521. package/src/auth/events/signout.ts +0 -33
  522. package/src/auth/providers/credentials.ts +0 -256
  523. package/src/auth/providers/index.ts +0 -6
  524. package/src/auth/providers/oauth.ts +0 -114
  525. package/src/lib/nextauth-secret.ts +0 -121
  526. package/src/types/next-auth.d.ts +0 -15
@@ -1,425 +0,0 @@
1
- "use strict";
2
- /**
3
- * IDP Client Configuration
4
- *
5
- * Fetches full client configuration from IDP including:
6
- * - OAuth provider credentials (from Key Vault)
7
- * - 2FA/MFA settings
8
- * - Session configuration
9
- * - NextAuth secret
10
- * - Branding
11
- *
12
- * CACHING STRATEGY:
13
- * 1. In-memory cache (fastest, but lost on module reload in dev)
14
- * 2. Redis cache (survives module reloads, shared across instances)
15
- * 3. IDP fetch (when both caches miss)
16
- *
17
- * NO FALLBACKS. If IDP doesn't respond correctly, we fail loud.
18
- *
19
- * @version 2.0.0 - Added Redis-backed caching
20
- */
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.getIDPClientConfig = getIDPClientConfig;
26
- exports.clearConfigCache = clearConfigCache;
27
- exports.getEnabledProviders = getEnabledProviders;
28
- require("server-only");
29
- const crypto_1 = require("crypto");
30
- const redis_1 = __importDefault(require("./redis"));
31
- // ============================================================================
32
- // Cache & Fetch Deduplication
33
- // ============================================================================
34
- let cachedConfig = null;
35
- let cacheExpiry = 0;
36
- let pendingFetch = null; // Prevents parallel fetches
37
- // ============================================================================
38
- // Redis Cache Configuration
39
- // ============================================================================
40
- const REDIS_CONFIG_KEY_PREFIX = 'idp_config:';
41
- function getRedisConfigKey() {
42
- const clientId = process.env.CLIENT_ID || process.env.NEXT_PUBLIC_CLIENT_ID || 'default';
43
- return `${REDIS_CONFIG_KEY_PREFIX}${clientId}`;
44
- }
45
- async function getConfigFromRedis() {
46
- try {
47
- const key = getRedisConfigKey();
48
- const cached = await redis_1.default.get(key);
49
- if (!cached)
50
- return null;
51
- const parsed = JSON.parse(cached);
52
- if (Date.now() >= parsed.expiresAt) {
53
- // Expired, delete it
54
- await redis_1.default.del(key);
55
- return null;
56
- }
57
- return parsed.config;
58
- }
59
- catch (error) {
60
- console.warn('[IDP_CONFIG] Failed to read from Redis cache:', error);
61
- return null;
62
- }
63
- }
64
- async function setConfigInRedis(config) {
65
- try {
66
- const key = getRedisConfigKey();
67
- const ttlSeconds = config.configCacheTtlSeconds || 300;
68
- const data = {
69
- config,
70
- expiresAt: Date.now() + (ttlSeconds * 1000)
71
- };
72
- // Store with TTL slightly longer than the logical expiry to allow for clock skew
73
- await redis_1.default.set(key, JSON.stringify(data), 'EX', ttlSeconds + 10);
74
- }
75
- catch (error) {
76
- console.warn('[IDP_CONFIG] Failed to write to Redis cache:', error);
77
- }
78
- }
79
- // ============================================================================
80
- // Circuit Breaker & Backoff State
81
- // ============================================================================
82
- let consecutiveFailures = 0;
83
- let lastFailureTime = 0;
84
- const MAX_FAILURES = 3;
85
- const CIRCUIT_OPEN_MS = 300000; // 5 minutes
86
- const MAX_BACKOFF_MS = 30000; // 30 seconds max backoff
87
- // ============================================================================
88
- // Main Functions
89
- // ============================================================================
90
- /**
91
- * Get IDP client configuration with multi-tier caching.
92
- *
93
- * Caching layers (checked in order):
94
- * 1. In-memory cache (fastest, lost on module reload in dev)
95
- * 2. Redis cache (survives module reloads)
96
- * 3. IDP fetch (when both caches miss)
97
- *
98
- * THROWS if IDP is unavailable or misconfigured. No fallbacks.
99
- */
100
- async function getIDPClientConfig(forceRefresh = false) {
101
- const now = Date.now();
102
- // Layer 1: Return in-memory cached if still valid (skip if forceRefresh)
103
- if (!forceRefresh && cachedConfig && now < cacheExpiry) {
104
- return cachedConfig;
105
- }
106
- // If a fetch is already in progress, wait for it instead of starting another
107
- if (pendingFetch) {
108
- return pendingFetch;
109
- }
110
- // Layer 2: Check Redis cache (skip if forceRefresh - startup should always get fresh data)
111
- if (!forceRefresh) {
112
- const redisConfig = await getConfigFromRedis();
113
- if (redisConfig) {
114
- // Restore to in-memory cache
115
- cachedConfig = redisConfig;
116
- cacheExpiry = Date.now() + ((redisConfig.configCacheTtlSeconds || 300) * 1000);
117
- // Set NEXTAUTH_SECRET from cached config
118
- if (redisConfig.nextAuthSecret) {
119
- process.env.NEXTAUTH_SECRET = redisConfig.nextAuthSecret;
120
- }
121
- // Set IDENTITY_CLIENT_BASE_EXTERNAL_URL from cached config
122
- // AUTH_TRUST_HOST=true tells NextAuth to derive OAuth callback URLs from headers.
123
- // Only set if not already defined (allows deployment override for beta/staging)
124
- if (redisConfig.baseClientUrl && !process.env.IDENTITY_CLIENT_BASE_EXTERNAL_URL) {
125
- process.env.IDENTITY_CLIENT_BASE_EXTERNAL_URL = redisConfig.baseClientUrl;
126
- }
127
- return redisConfig;
128
- }
129
- }
130
- // Layer 3: Fetch from IDP
131
- const internalIdpUrl = process.env.INTERNAL_IDP_URL;
132
- const idpUrl = process.env.IDP_URL;
133
- const clientIdStr = process.env.CLIENT_ID || process.env.NEXT_PUBLIC_CLIENT_ID;
134
- if (!clientIdStr) {
135
- throw new Error('[IDP_CONFIG] FATAL: CLIENT_ID or NEXT_PUBLIC_CLIENT_ID must be set');
136
- }
137
- if (!internalIdpUrl && !idpUrl) {
138
- throw new Error('[IDP_CONFIG] FATAL: INTERNAL_IDP_URL or IDP_URL must be set');
139
- }
140
- // Start fetch and store promise so concurrent callers wait for same result
141
- const fetcher = internalIdpUrl
142
- ? fetchConfigFromInternalIDP(internalIdpUrl, clientIdStr)
143
- : fetchConfigFromIDP(idpUrl, clientIdStr);
144
- pendingFetch = fetcher
145
- .then(async (config) => {
146
- // Cache with TTL from response (default 5 minutes)
147
- cachedConfig = config;
148
- cacheExpiry = Date.now() + ((config.configCacheTtlSeconds || 300) * 1000);
149
- // Store in Redis for persistence across module reloads
150
- await setConfigInRedis(config);
151
- // Set NEXTAUTH_SECRET from config
152
- if (config.nextAuthSecret) {
153
- process.env.NEXTAUTH_SECRET = config.nextAuthSecret;
154
- }
155
- else {
156
- throw new Error('[IDP_CONFIG] FATAL: IDP did not return nextAuthSecret');
157
- }
158
- // Set IDENTITY_CLIENT_BASE_EXTERNAL_URL from config
159
- // AUTH_TRUST_HOST=true tells NextAuth to derive OAuth callback URLs from headers.
160
- // Only set if not already defined (allows deployment override for beta/staging)
161
- if (config.baseClientUrl && !process.env.IDENTITY_CLIENT_BASE_EXTERNAL_URL) {
162
- process.env.IDENTITY_CLIENT_BASE_EXTERNAL_URL = config.baseClientUrl;
163
- console.log("[IDP_CONFIG] Set IDENTITY_CLIENT_BASE_EXTERNAL_URL:", config.baseClientUrl);
164
- }
165
- return config;
166
- })
167
- .finally(() => {
168
- pendingFetch = null; // Clear so next cache miss can fetch again
169
- });
170
- return pendingFetch;
171
- }
172
- /**
173
- * Clear the config cache (useful for testing or forced refresh)
174
- */
175
- function clearConfigCache() {
176
- cachedConfig = null;
177
- cacheExpiry = 0;
178
- }
179
- /**
180
- * Get enabled OAuth providers from config
181
- */
182
- function getEnabledProviders(config) {
183
- return config.oauthProviders?.filter(p => p.enabled) || [];
184
- }
185
- // ============================================================================
186
- // Internal Functions
187
- // ============================================================================
188
- async function fetchConfigFromInternalIDP(internalIdpUrl, clientIdStr) {
189
- const containersKey = process.env.CONTAINERS_KEY;
190
- if (!containersKey) {
191
- throw new Error('[IDP_CONFIG] FATAL: CONTAINERS_KEY is required when using INTERNAL_IDP_URL');
192
- }
193
- const url = `${internalIdpUrl.replace(/\/$/, '')}/InternalClientConfig/${encodeURIComponent(clientIdStr)}`;
194
- console.log(`[IDP_CONFIG] Fetching config from internal IDP: ${url}`);
195
- const resp = await fetch(url, {
196
- method: 'GET',
197
- headers: {
198
- 'Accept': 'application/json',
199
- 'Authorization': `Secret ${containersKey}`,
200
- },
201
- cache: 'no-store'
202
- });
203
- if (!resp.ok) {
204
- const txt = await resp.text().catch(() => 'Unknown error');
205
- throw new Error(`[IDP_CONFIG] FATAL: Internal IDP returned ${resp.status} - ${txt}`);
206
- }
207
- const body = await resp.json().catch(() => null);
208
- if (!body) {
209
- throw new Error('[IDP_CONFIG] FATAL: Internal IDP returned empty or invalid JSON');
210
- }
211
- const configData = body?.data ?? body;
212
- const rawClientId = configData.clientId ?? configData.client_id;
213
- if (rawClientId === undefined || rawClientId === null) {
214
- throw new Error(`[IDP_CONFIG] FATAL: Internal IDP response missing clientId. Got: ${JSON.stringify(Object.keys(configData))}`);
215
- }
216
- const config = {
217
- clientId: String(rawClientId),
218
- clientSlug: configData.clientSlug ?? configData.client_slug ?? configData.slug ?? '',
219
- nextAuthSecret: configData.nextAuthSecret ?? configData.next_auth_secret ?? '',
220
- configCacheTtlSeconds: configData.configCacheTtlSeconds ?? configData.config_cache_ttl_seconds ?? 300,
221
- oauthProviders: (configData.oauthProviders ?? configData.oauth_providers ?? []).map((p) => ({
222
- provider: p.provider ?? '',
223
- enabled: p.enabled ?? false,
224
- clientId: p.clientId ?? p.client_id ?? '',
225
- clientSecret: p.clientSecret ?? p.client_secret ?? '',
226
- scopes: p.scopes,
227
- additionalParams: p.additionalParams ?? p.additional_params
228
- })),
229
- authSettings: {
230
- require2FA: configData.authSettings?.require2FA ?? configData.auth_settings?.require_2fa ?? true,
231
- allowed2FAMethods: configData.authSettings?.allowed2FAMethods ?? configData.auth_settings?.allowed_2fa_methods ?? ['email', 'sms'],
232
- mfaGracePeriodHours: configData.authSettings?.mfaGracePeriodHours ?? configData.auth_settings?.mfa_grace_period_hours ?? 24,
233
- mfaRememberDeviceDays: configData.authSettings?.mfaRememberDeviceDays ?? configData.auth_settings?.mfa_remember_device_days ?? 30,
234
- sessionTimeoutMinutes: configData.authSettings?.sessionTimeoutMinutes ?? configData.auth_settings?.session_timeout_minutes ?? 60,
235
- idleTimeoutMinutes: configData.authSettings?.idleTimeoutMinutes ?? configData.auth_settings?.idle_timeout_minutes ?? 15,
236
- allowRememberMe: configData.authSettings?.allowRememberMe ?? configData.auth_settings?.allow_remember_me ?? true,
237
- rememberMeDays: configData.authSettings?.rememberMeDays ?? configData.auth_settings?.remember_me_days ?? 30,
238
- lockoutThreshold: configData.authSettings?.lockoutThreshold ?? configData.auth_settings?.lockout_threshold ?? 5,
239
- lockoutDurationMinutes: configData.authSettings?.lockoutDurationMinutes ?? configData.auth_settings?.lockout_duration_minutes ?? 15
240
- },
241
- branding: {
242
- theme: configData.branding?.theme,
243
- primaryColor: configData.branding?.primaryColor ?? configData.branding?.primary_color,
244
- secondaryColor: configData.branding?.secondaryColor ?? configData.branding?.secondary_color,
245
- logoUrl: configData.branding?.logoUrl ?? configData.branding?.logo_url
246
- },
247
- baseClientUrl: configData.baseClientUrl ?? configData.base_client_url ?? configData.BaseClientUrl
248
- };
249
- if (!config.nextAuthSecret) {
250
- throw new Error('[IDP_CONFIG] FATAL: Internal IDP did not return nextAuthSecret');
251
- }
252
- console.log(`[IDP_CONFIG] Internal IDP config loaded for ${clientIdStr}`);
253
- consecutiveFailures = 0;
254
- return config;
255
- }
256
- async function fetchConfigFromIDP(idpUrl, clientIdStr) {
257
- // =========================================================================
258
- // Circuit Breaker Check
259
- // =========================================================================
260
- if (consecutiveFailures >= MAX_FAILURES) {
261
- const timeSinceFailure = Date.now() - lastFailureTime;
262
- if (timeSinceFailure < CIRCUIT_OPEN_MS) {
263
- // Circuit is open - return stale cache if available
264
- if (cachedConfig) {
265
- return cachedConfig;
266
- }
267
- throw new Error(`[IDP_CONFIG] Circuit breaker OPEN - no cached config available. Retry in ${Math.round((CIRCUIT_OPEN_MS - timeSinceFailure) / 1000)}s`);
268
- }
269
- // Half-open state: allow one request to test
270
- consecutiveFailures = MAX_FAILURES - 1;
271
- }
272
- // =========================================================================
273
- // Exponential Backoff Check
274
- // =========================================================================
275
- if (consecutiveFailures > 0) {
276
- const backoffMs = Math.min(1000 * Math.pow(2, consecutiveFailures), MAX_BACKOFF_MS);
277
- const timeSinceFailure = Date.now() - lastFailureTime;
278
- if (timeSinceFailure < backoffMs) {
279
- const remainingMs = backoffMs - timeSinceFailure;
280
- // Return stale cache during backoff if available
281
- if (cachedConfig) {
282
- return cachedConfig;
283
- }
284
- throw new Error(`[IDP_CONFIG] In backoff period - retry in ${Math.round(remainingMs)}ms`);
285
- }
286
- }
287
- try {
288
- // Step 1: Get signed client assertion from IDP
289
- const signingUrl = `${idpUrl.replace(/\/$/, '')}/api/ExternalAuth/sign-client-assertion`;
290
- const signingPayload = {
291
- issuer: clientIdStr,
292
- subject: clientIdStr,
293
- audience: 'urn:payez:externalauth:clientconfig',
294
- expires_in: 60,
295
- };
296
- const signingResp = await fetch(signingUrl, {
297
- method: 'POST',
298
- headers: {
299
- 'Accept': 'application/json',
300
- 'Content-Type': 'application/json',
301
- 'X-Client-Id': clientIdStr,
302
- 'X-Correlation-Id': (0, crypto_1.randomUUID)().replace(/-/g, ''),
303
- },
304
- body: JSON.stringify(signingPayload),
305
- cache: 'no-store'
306
- });
307
- if (!signingResp.ok) {
308
- const txt = await signingResp.text().catch(() => 'Unknown error');
309
- throw new Error(`[IDP_CONFIG] FATAL: Failed to sign client assertion: ${signingResp.status} - ${txt}`);
310
- }
311
- const signingBody = await signingResp.json().catch(() => null);
312
- if (!signingBody) {
313
- throw new Error('[IDP_CONFIG] FATAL: IDP returned empty or invalid JSON for sign-client-assertion');
314
- }
315
- // Per PayEz API standard: response is { success, data: { client_assertion }, ... }
316
- // But IDP might use camelCase (clientAssertion) - check both
317
- const client_assertion = (signingBody?.data?.client_assertion ??
318
- signingBody?.data?.clientAssertion);
319
- if (!client_assertion) {
320
- console.error('[IDP_CONFIG] FATAL: Full response body:', JSON.stringify(signingBody, null, 2));
321
- throw new Error(`[IDP_CONFIG] FATAL: IDP response missing client_assertion. Got keys: ${JSON.stringify(Object.keys(signingBody?.data || signingBody || {}))}`);
322
- }
323
- // Step 2: Fetch client config using the assertion
324
- const configUrl = `${idpUrl.replace(/\/$/, '')}/api/ExternalAuth/client-config`;
325
- const configResp = await fetch(configUrl, {
326
- method: 'POST',
327
- headers: {
328
- 'Accept': 'application/json',
329
- 'Content-Type': 'application/json',
330
- 'X-Client-Id': clientIdStr,
331
- 'X-Correlation-Id': (0, crypto_1.randomUUID)().replace(/-/g, ''),
332
- },
333
- body: JSON.stringify({ client_assertion }),
334
- cache: 'no-store'
335
- });
336
- if (!configResp.ok) {
337
- const txt = await configResp.text().catch(() => 'Unknown error');
338
- throw new Error(`[IDP_CONFIG] FATAL: Failed to fetch client config: ${configResp.status} - ${txt}`);
339
- }
340
- const configBody = await configResp.json().catch(() => null);
341
- if (!configBody) {
342
- throw new Error('[IDP_CONFIG] FATAL: IDP returned empty or invalid JSON for client-config');
343
- }
344
- // Per PayEz API standard: response is wrapped in { success, data: {...} }
345
- const configData = configBody?.data;
346
- if (!configData || typeof configData !== 'object') {
347
- console.error('[IDP_CONFIG] FATAL: Full config response body:', JSON.stringify(configBody, null, 2));
348
- throw new Error('[IDP_CONFIG] FATAL: IDP client-config response missing data envelope');
349
- }
350
- // Validate required fields - handle both number and string client_id
351
- const rawClientId = configData.clientId ?? configData.client_id;
352
- if (rawClientId === undefined || rawClientId === null) {
353
- throw new Error(`[IDP_CONFIG] FATAL: IDP response missing clientId/client_id. Got: ${JSON.stringify(Object.keys(configData))}`);
354
- }
355
- // Map response to our interface (IDP always returns snake_case)
356
- const config = {
357
- clientId: String(rawClientId),
358
- clientSlug: configData.clientSlug ?? configData.client_slug ?? configData.slug ?? '',
359
- nextAuthSecret: configData.nextAuthSecret ?? configData.next_auth_secret ?? '',
360
- configCacheTtlSeconds: configData.configCacheTtlSeconds ?? configData.config_cache_ttl_seconds ?? 300,
361
- oauthProviders: (configData.oauthProviders ?? configData.oauth_providers ?? []).map((p) => ({
362
- provider: p.provider ?? '',
363
- enabled: p.enabled ?? false,
364
- clientId: p.clientId ?? p.client_id ?? '',
365
- clientSecret: p.clientSecret ?? p.client_secret ?? '',
366
- scopes: p.scopes,
367
- additionalParams: p.additionalParams ?? p.additional_params
368
- })),
369
- authSettings: {
370
- require2FA: (() => {
371
- // Check nested locations first (canonical)
372
- const nested = configData.authSettings?.require2FA ?? configData.auth_settings?.require_2fa;
373
- if (nested !== undefined)
374
- return nested;
375
- // TRANSITION FALLBACK: Check top-level (deprecated)
376
- const topLevel = configData.require2FA ?? configData.require_2fa;
377
- if (topLevel !== undefined) {
378
- console.warn('[IDP_CONFIG] DEPRECATION: require2FA found at top-level. Should be nested under auth_settings. Update IDP.');
379
- return topLevel;
380
- }
381
- return true; // Default to true for security
382
- })(),
383
- allowed2FAMethods: configData.authSettings?.allowed2FAMethods ?? configData.auth_settings?.allowed_2fa_methods ?? ['email', 'sms'],
384
- mfaGracePeriodHours: configData.authSettings?.mfaGracePeriodHours ?? configData.auth_settings?.mfa_grace_period_hours ?? 24,
385
- mfaRememberDeviceDays: configData.authSettings?.mfaRememberDeviceDays ?? configData.auth_settings?.mfa_remember_device_days ?? 30,
386
- sessionTimeoutMinutes: configData.authSettings?.sessionTimeoutMinutes ?? configData.auth_settings?.session_timeout_minutes ?? 60,
387
- idleTimeoutMinutes: configData.authSettings?.idleTimeoutMinutes ?? configData.auth_settings?.idle_timeout_minutes ?? 15,
388
- allowRememberMe: configData.authSettings?.allowRememberMe ?? configData.auth_settings?.allow_remember_me ?? true,
389
- rememberMeDays: configData.authSettings?.rememberMeDays ?? configData.auth_settings?.remember_me_days ?? 30,
390
- lockoutThreshold: configData.authSettings?.lockoutThreshold ?? configData.auth_settings?.lockout_threshold ?? 5,
391
- lockoutDurationMinutes: configData.authSettings?.lockoutDurationMinutes ?? configData.auth_settings?.lockout_duration_minutes ?? 15
392
- },
393
- branding: {
394
- theme: configData.branding?.theme,
395
- primaryColor: configData.branding?.primaryColor ?? configData.branding?.primary_color,
396
- secondaryColor: configData.branding?.secondaryColor ?? configData.branding?.secondary_color,
397
- logoUrl: configData.branding?.logoUrl ?? configData.branding?.logo_url
398
- },
399
- baseClientUrl: configData.baseClientUrl ?? configData.base_client_url ?? configData.BaseClientUrl
400
- };
401
- // Debug: log what we got for baseClientUrl
402
- console.log(`[IDP_CONFIG] Parsed baseClientUrl:`, config.baseClientUrl, `| raw keys:`, Object.keys(configData).filter(k => k.toLowerCase().includes('client')));
403
- // Validate we got what we need
404
- if (!config.clientId) {
405
- throw new Error('[IDP_CONFIG] FATAL: clientId is empty or missing after parsing');
406
- }
407
- if (!config.nextAuthSecret) {
408
- throw new Error('[IDP_CONFIG] FATAL: nextAuthSecret is empty after parsing');
409
- }
410
- // Success - reset failure tracking
411
- consecutiveFailures = 0;
412
- return config;
413
- }
414
- catch (error) {
415
- // Track failure for circuit breaker
416
- consecutiveFailures++;
417
- lastFailureTime = Date.now();
418
- console.error('[IDP_CONFIG] Fetch failed', {
419
- consecutiveFailures,
420
- maxFailures: MAX_FAILURES,
421
- error: error instanceof Error ? error.message : String(error)
422
- });
423
- throw error;
424
- }
425
- }
@@ -1,14 +0,0 @@
1
- import { NextRequest } from 'next/server';
2
- /**
3
- * Centralized IDP fetch helper
4
- * - Injects Bearer from Redis session
5
- * - If access token is expired/near-expiry, triggers one refresh and retries fetch once
6
- * - Returns parsed JSON and HTTP status
7
- */
8
- export interface IdpFetchResult<T = any> {
9
- ok: boolean;
10
- status: number;
11
- json: T | null;
12
- attemptedRefresh: boolean;
13
- }
14
- export declare function idpFetchJSON<T = any>(req: NextRequest, targetUrl: string, init?: RequestInit): Promise<IdpFetchResult<T>>;
@@ -1,91 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.idpFetchJSON = idpFetchJSON;
4
- const test_aware_get_token_1 = require("./test-aware-get-token");
5
- const session_store_1 = require("./session-store");
6
- const internal_api_1 = require("./internal-api");
7
- function buildHeaders(req, bearer, extra) {
8
- const headers = {
9
- Accept: 'application/json',
10
- 'Content-Type': 'application/json',
11
- ...extra,
12
- };
13
- const xfwd = req.headers.get('x-forwarded-for') || req.headers.get('x-real-ip');
14
- if (xfwd)
15
- headers['X-Forwarded-For'] = xfwd.split(',')[0].trim();
16
- const ua = req.headers.get('user-agent');
17
- if (ua)
18
- headers['User-Agent'] = ua;
19
- if (bearer)
20
- headers['Authorization'] = `Bearer ${bearer}`;
21
- return headers;
22
- }
23
- async function ensureFreshAccessToken(req) {
24
- const token = await (0, test_aware_get_token_1.getTokenTestAware)(req);
25
- // Support both field names: sessionToken (auth.ts JWT) and redisSessionId (legacy)
26
- const sessionToken = (token?.sessionToken || token?.redisSessionId);
27
- console.log('[IDP_FETCH] ensureFreshAccessToken:', {
28
- hasToken: !!token,
29
- sessionToken: sessionToken?.substring(0, 20) + '...',
30
- pathname: req.nextUrl.pathname
31
- });
32
- if (!sessionToken) {
33
- console.warn('[IDP_FETCH] No sessionToken found in JWT - Bearer token will NOT be sent!');
34
- return {};
35
- }
36
- let session = await (0, session_store_1.getSession)(sessionToken);
37
- console.log('[IDP_FETCH] Redis session lookup:', {
38
- hasSession: !!session,
39
- hasAccessToken: !!session?.idpAccessToken,
40
- bearerKeyId: session?.bearerKeyId || 'NOT_SET',
41
- idpClientId: session?.idpClientId || 'NOT_SET',
42
- });
43
- if (!session?.idpAccessToken)
44
- return { sessionToken };
45
- const now = Date.now();
46
- const timeLeft = (session.idpAccessTokenExpires ?? now) - now;
47
- // Treat tokens as effectively expired if within 5 minutes of expiry
48
- if (timeLeft > 5 * 60 * 1000) {
49
- return { sessionToken, accessToken: session.idpAccessToken };
50
- }
51
- // attempt refresh once via centralized internal API helper
52
- try {
53
- await (0, internal_api_1.internalRefresh)(req.headers.get('cookie') || '', sessionToken);
54
- }
55
- catch { }
56
- session = await (0, session_store_1.getSession)(sessionToken);
57
- return { sessionToken, accessToken: session?.idpAccessToken };
58
- }
59
- async function idpFetchJSON(req, targetUrl, init = {}) {
60
- let attemptedRefresh = false;
61
- let { accessToken, sessionToken } = await ensureFreshAccessToken(req);
62
- const makeCall = async (bearer) => {
63
- const res = await fetch(targetUrl, {
64
- ...init,
65
- headers: buildHeaders(req, bearer, init.headers),
66
- });
67
- let json = null;
68
- try {
69
- json = await res.json();
70
- }
71
- catch {
72
- json = null;
73
- }
74
- return { res, json };
75
- };
76
- // First attempt
77
- let { res, json } = await makeCall(accessToken);
78
- if ((res.status === 401 || res.status === 403) && sessionToken && !attemptedRefresh) {
79
- attemptedRefresh = true;
80
- try {
81
- // Use centralized internal API helper for server-to-server calls
82
- const rf = await (0, internal_api_1.internalRefresh)(req.headers.get('cookie') || '', sessionToken);
83
- if (rf.ok) {
84
- const fresh = await (0, session_store_1.getSession)(sessionToken);
85
- ({ res, json } = await makeCall(fresh?.idpAccessToken));
86
- }
87
- }
88
- catch { }
89
- }
90
- return { ok: res.ok, status: res.status, json: json, attemptedRefresh };
91
- }
@@ -1,87 +0,0 @@
1
- /**
2
- * Centralized internal API helper for the app to call ITSELF.
3
- *
4
- * IMPORTANT: All calls from the Next.js server to its own API routes MUST use
5
- * these functions. Never use req.url, req.nextUrl.origin, or construct URLs
6
- * from the incoming request.
7
- *
8
- * WHY HTTP IS REQUIRED (not optional):
9
- * - This is the app calling its OWN backend within the same pod/container
10
- * - NextAuth cookies are encrypted based on request protocol
11
- * - TLS is terminated at ingress, so the pod receives HTTP internally
12
- * - Using HTTPS here causes cookie decryption failures and 403 errors
13
- * - This is NOT about "K8s traffic doesn't need TLS" - it's about
14
- * protocol consistency for cookie/session encryption
15
- *
16
- * Environment:
17
- * - INTERNAL_API_URL: Required in production (e.g., http://service.namespace.svc.cluster.local:80)
18
- * - Falls back to http://localhost:3200 in development only
19
- */
20
- /**
21
- * Get the internal API base URL for the app to call itself.
22
- *
23
- * @throws Error in production if INTERNAL_API_URL is not set
24
- * @returns The base URL (no trailing slash)
25
- */
26
- export declare function getInternalApiUrl(): string;
27
- /**
28
- * Options for internal fetch calls
29
- */
30
- export interface InternalFetchOptions extends Omit<RequestInit, 'headers'> {
31
- /** Additional headers to include */
32
- headers?: Record<string, string>;
33
- /** Cookie header to forward (typically from req.headers.get('cookie')) */
34
- cookie?: string;
35
- /** Session token for x-session-token header */
36
- sessionToken?: string;
37
- /** Request ID for tracing */
38
- requestId?: string;
39
- /** Parse response as JSON (default: true) */
40
- parseJson?: boolean;
41
- }
42
- /**
43
- * Result of an internal fetch call
44
- */
45
- export interface InternalFetchResult<T = unknown> {
46
- ok: boolean;
47
- status: number;
48
- statusText: string;
49
- data: T | null;
50
- response: Response;
51
- }
52
- /**
53
- * Make a fetch call to an internal API route (app calling itself).
54
- *
55
- * @param path - The API path (e.g., '/api/auth/refresh')
56
- * @param options - Fetch options
57
- * @returns The fetch result with parsed data
58
- *
59
- * @example
60
- * ```ts
61
- * // Simple GET
62
- * const result = await internalFetch('/api/health');
63
- *
64
- * // POST with session
65
- * const result = await internalFetch('/api/auth/refresh', {
66
- * method: 'POST',
67
- * cookie: req.headers.get('cookie') || '',
68
- * sessionToken: token.redisSessionId,
69
- * body: JSON.stringify({ refresh_token: refreshToken }),
70
- * });
71
- * ```
72
- */
73
- export declare function internalFetch<T = unknown>(path: string, options?: InternalFetchOptions): Promise<InternalFetchResult<T>>;
74
- /**
75
- * Trigger a token refresh via the internal API.
76
- * This is a convenience wrapper for the common refresh pattern.
77
- *
78
- * @param cookie - The cookie header from the incoming request
79
- * @param sessionToken - The session token
80
- * @param refreshToken - Optional refresh token to include in body
81
- * @param requestId - Optional request ID for tracing
82
- * @returns Whether the refresh was successful
83
- */
84
- export declare function internalRefresh(cookie: string, sessionToken: string, refreshToken?: string, requestId?: string): Promise<{
85
- ok: boolean;
86
- status: number;
87
- }>;