@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,786 +0,0 @@
1
- "use strict";
2
- "use client";
3
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
- if (k2 === undefined) k2 = k;
5
- var desc = Object.getOwnPropertyDescriptor(m, k);
6
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
- desc = { enumerable: true, get: function() { return m[k]; } };
8
- }
9
- Object.defineProperty(o, k2, desc);
10
- }) : (function(o, m, k, k2) {
11
- if (k2 === undefined) k2 = k;
12
- o[k2] = m[k];
13
- }));
14
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
- Object.defineProperty(o, "default", { enumerable: true, value: v });
16
- }) : function(o, v) {
17
- o["default"] = v;
18
- });
19
- var __importStar = (this && this.__importStar) || (function () {
20
- var ownKeys = function(o) {
21
- ownKeys = Object.getOwnPropertyNames || function (o) {
22
- var ar = [];
23
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
- return ar;
25
- };
26
- return ownKeys(o);
27
- };
28
- return function (mod) {
29
- if (mod && mod.__esModule) return mod;
30
- var result = {};
31
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
- __setModuleDefault(result, mod);
33
- return result;
34
- };
35
- })();
36
- Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.standardizedApi = exports.ApiNetworkError = exports.ApiValidationError = exports.ApiBusinessLogicError = exports.ApiResponseFormatError = void 0;
38
- exports.isApiSuccess = isApiSuccess;
39
- exports.isApiPagedSuccess = isApiPagedSuccess;
40
- exports.isApiError = isApiError;
41
- exports.extractApiData = extractApiData;
42
- exports.extractApiItems = extractApiItems;
43
- // ========================================================================================
44
- // BULLETPROOF STANDARDIZED CLIENT API - ZERO TOLERANCE FOR BAD RESPONSES
45
- // ========================================================================================
46
- // This client API ENFORCES the standardized response format
47
- // It will BREAK if APIs don't return the expected structure
48
- // NO MORE GUESSING data.data.data.data - EVER AGAIN!
49
- // ========================================================================================
50
- const react_1 = require("next-auth/react");
51
- const api_responses_1 = require("./types/api-responses");
52
- // ========================================================================================
53
- // CLIENT API ERROR TYPES
54
- // ========================================================================================
55
- /**
56
- * ERROR THROWN WHEN API RESPONSE FORMAT IS INVALID
57
- * This means the API is NOT following our standardized format
58
- */
59
- class ApiResponseFormatError extends Error {
60
- endpoint;
61
- rawResponse;
62
- constructor(message, endpoint, rawResponse) {
63
- super(`API_FORMAT_ERROR: ${message}`);
64
- this.endpoint = endpoint;
65
- this.rawResponse = rawResponse;
66
- this.name = 'ApiResponseFormatError';
67
- }
68
- }
69
- exports.ApiResponseFormatError = ApiResponseFormatError;
70
- /**
71
- * ERROR THROWN WHEN API RETURNS A STANDARDIZED ERROR RESPONSE
72
- * This is a properly formatted error from the API
73
- */
74
- class ApiBusinessLogicError extends Error {
75
- errorCode;
76
- operation;
77
- details;
78
- constructor(errorCode, message, operation, details) {
79
- super(message);
80
- this.errorCode = errorCode;
81
- this.operation = operation;
82
- this.details = details;
83
- this.name = 'ApiBusinessLogicError';
84
- }
85
- }
86
- exports.ApiBusinessLogicError = ApiBusinessLogicError;
87
- /**
88
- * ERROR THROWN WHEN VALIDATION FAILS
89
- * This is a properly formatted validation error from the API
90
- */
91
- class ApiValidationError extends Error {
92
- operation;
93
- validationErrors;
94
- invalidValue;
95
- primaryField;
96
- constructor(message, operation, validationErrors, invalidValue, primaryField) {
97
- super(message);
98
- this.operation = operation;
99
- this.validationErrors = validationErrors;
100
- this.invalidValue = invalidValue;
101
- this.primaryField = primaryField;
102
- this.name = 'ApiValidationError';
103
- }
104
- }
105
- exports.ApiValidationError = ApiValidationError;
106
- /**
107
- * ERROR THROWN WHEN NETWORK/HTTP ISSUES OCCUR
108
- */
109
- class ApiNetworkError extends Error {
110
- status;
111
- endpoint;
112
- constructor(message, status, endpoint) {
113
- super(`NETWORK_ERROR: ${message}`);
114
- this.status = status;
115
- this.endpoint = endpoint;
116
- this.name = 'ApiNetworkError';
117
- }
118
- }
119
- exports.ApiNetworkError = ApiNetworkError;
120
- // ========================================================================================
121
- // AUTHENTICATION STATE MANAGEMENT
122
- // ========================================================================================
123
- // Coordinate client-side refresh to avoid duplicate refresh calls racing with
124
- // server-side middleware or other tabs. Only one refresh runs at a time.
125
- let refreshInFlight = null;
126
- // Enhanced redirect logic with grace period and retry attempts
127
- let authRedirectScheduled = false;
128
- let lastAuthFailureTime = 0;
129
- let consecutiveAuthFailures = 0;
130
- const AUTH_FAILURE_GRACE_PERIOD = 2000; // 2 seconds grace period
131
- const MAX_AUTH_FAILURES_BEFORE_REDIRECT = 2; // Allow 2 failures before redirect
132
- const AUTH_FAILURE_RESET_WINDOW = 30000; // Reset failure count after 30 seconds
133
- // Helper: detect pre-2FA session (session exists, requires 2FA and not completed)
134
- function isPreTwoFactorSession(session) {
135
- return !!(session?.user?.requiresTwoFactor && !session?.user?.twoFactorSessionVerified);
136
- }
137
- // Reset auth failure state on successful requests
138
- function resetAuthFailureState() {
139
- if (consecutiveAuthFailures > 0) {
140
- console.log(`✅ Resetting auth failure state (was ${consecutiveAuthFailures} failures)`);
141
- consecutiveAuthFailures = 0;
142
- lastAuthFailureTime = 0;
143
- authRedirectScheduled = false;
144
- }
145
- }
146
- function scheduleLoginRedirect(isImmediate = false) {
147
- if (authRedirectScheduled)
148
- return;
149
- const now = Date.now();
150
- // Reset consecutive failures if enough time has passed
151
- if (now - lastAuthFailureTime > AUTH_FAILURE_RESET_WINDOW) {
152
- consecutiveAuthFailures = 0;
153
- }
154
- consecutiveAuthFailures++;
155
- lastAuthFailureTime = now;
156
- console.warn(`🔴 Auth failure #${consecutiveAuthFailures}, immediate: ${isImmediate}`);
157
- // Only redirect if we've had multiple failures or if explicitly requested
158
- if (!isImmediate && consecutiveAuthFailures < MAX_AUTH_FAILURES_BEFORE_REDIRECT) {
159
- console.log(`⏳ Delaying redirect - only ${consecutiveAuthFailures} failures so far`);
160
- return;
161
- }
162
- authRedirectScheduled = true;
163
- const redirectFunction = () => {
164
- try {
165
- const returnUrl = encodeURIComponent(`${window.location.pathname}${window.location.search}`);
166
- console.warn(`🔄 Redirecting to login with return URL: ${returnUrl}`);
167
- window.location.href = `/account-auth/login?returnUrl=${returnUrl}`;
168
- }
169
- catch (error) {
170
- console.error('❌ Error during login redirect:', error);
171
- // Final fallback
172
- try {
173
- window.location.href = '/account-auth/login';
174
- }
175
- catch {
176
- // no-op if window is not available
177
- }
178
- }
179
- };
180
- if (isImmediate) {
181
- // Immediate redirect for critical auth failures
182
- redirectFunction();
183
- }
184
- else {
185
- // Small delay to allow any pending requests to complete
186
- console.log(`⏳ Scheduling redirect with ${AUTH_FAILURE_GRACE_PERIOD}ms grace period`);
187
- setTimeout(redirectFunction, AUTH_FAILURE_GRACE_PERIOD);
188
- }
189
- }
190
- // ========================================================================================
191
- // BULLETPROOF CLIENT API SERVICE
192
- // ========================================================================================
193
- class StandardizedClientApiService {
194
- baseUrl;
195
- constructor() {
196
- this.baseUrl = '';
197
- }
198
- /**
199
- * MAKES HTTP REQUEST AND VALIDATES RESPONSE FORMAT
200
- * This method ENFORCES standardized response format compliance
201
- * Will throw ApiResponseFormatError if format is invalid
202
- */
203
- async makeRequest(endpoint, options = {}, sessionToken) {
204
- const fullEndpoint = `${this.baseUrl}${endpoint}`;
205
- try {
206
- // Use provided token or get from NextAuth session
207
- const currentSession = await (0, react_1.getSession)();
208
- let token = sessionToken || currentSession?.accessToken;
209
- // Preflight freshness check: if token is near expiry, coordinate refresh BEFORE making request
210
- const pre2FA = isPreTwoFactorSession(currentSession);
211
- const hasRefresh = !!currentSession?.refreshToken;
212
- if (!pre2FA && hasRefresh) {
213
- try {
214
- let timeLeft = null;
215
- if (currentSession?.accessTokenExpires) {
216
- timeLeft = currentSession.accessTokenExpires - Date.now();
217
- }
218
- else if (token) {
219
- // Fallback decode only if session did not include expiry
220
- const { jwtDecode } = await Promise.resolve().then(() => __importStar(require('./jwt-decode-client')));
221
- const decoded = jwtDecode(token);
222
- const expMs = decoded?.exp ? decoded.exp * 1000 : 0;
223
- timeLeft = expMs - Date.now();
224
- }
225
- // Refresh if <= 60s remaining (or already expired)
226
- if (timeLeft !== null && !Number.isNaN(timeLeft) && timeLeft <= 60000) {
227
- console.log(`⏳ Access token expiring soon (${Math.floor(timeLeft / 1000)}s). Coordinating refresh before request...`);
228
- if (!refreshInFlight) {
229
- refreshInFlight = (async () => {
230
- const reqId = crypto.randomUUID();
231
- const rr = await fetch('/api/auth/refresh', {
232
- method: 'POST',
233
- credentials: 'include',
234
- headers: { 'X-Request-ID': reqId },
235
- });
236
- if (rr.ok || rr.status === 409) {
237
- // ok or in-progress; give it a beat in case of 409
238
- if (rr.status === 409)
239
- await new Promise(r => setTimeout(r, 1200));
240
- return true;
241
- }
242
- if (rr.status === 401 || rr.status === 403) {
243
- scheduleLoginRedirect();
244
- throw new ApiNetworkError('Authentication failed - unable to refresh session', rr.status, endpoint);
245
- }
246
- const et = await rr.text();
247
- throw new ApiNetworkError(et || 'Token refresh failed', rr.status, endpoint);
248
- })().finally(() => { refreshInFlight = null; });
249
- }
250
- await refreshInFlight;
251
- const newSessionAfter = await (0, react_1.getSession)();
252
- token = newSessionAfter?.accessToken || token;
253
- }
254
- }
255
- catch (preErr) {
256
- console.warn('Preflight token freshness check failed (continuing to attempt request):', preErr);
257
- }
258
- }
259
- else {
260
- // Elegantly skip preflight refresh in pre-2FA window or when no refresh token exists
261
- if (pre2FA) {
262
- console.log('⏭️ Skipping preflight refresh: 2FA not complete (no refresh allowed yet)');
263
- }
264
- else if (!hasRefresh) {
265
- console.log('⏭️ Skipping preflight refresh: no refresh token present');
266
- }
267
- }
268
- const config = {
269
- ...options,
270
- headers: {
271
- 'Content-Type': 'application/json',
272
- ...(token && { 'Authorization': `Bearer ${token}` }),
273
- ...options.headers,
274
- },
275
- };
276
- console.log(`🔄 API Request: ${options.method || 'GET'} ${fullEndpoint}`);
277
- const response = await fetch(fullEndpoint, config);
278
- if (!response.ok) {
279
- // Handle coordination blocking (503) with auto-retry
280
- if (response.status === 503) {
281
- console.log('🔄 Got 503 Service Unavailable, attempting auto-retry for coordination...');
282
- // Parse Retry-After header (in seconds)
283
- const retryAfterHeader = response.headers.get('Retry-After');
284
- let retryAfterSeconds = 1; // Default to 1 second
285
- if (retryAfterHeader && /^\d+$/.test(retryAfterHeader)) {
286
- retryAfterSeconds = parseInt(retryAfterHeader, 10);
287
- }
288
- const baseDelayMs = retryAfterSeconds * 1000;
289
- const maxRetries = 3;
290
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
291
- // Add jitter to prevent thundering herd
292
- const jitterMs = Math.floor(Math.random() * 300) - 150; // ±150ms jitter
293
- const exponentialBackoff = Math.pow(1.5, attempt - 1); // Mild exponential backoff
294
- const delayMs = Math.max(100, baseDelayMs * exponentialBackoff + jitterMs);
295
- console.log(`🔄 503 retry attempt ${attempt}/${maxRetries}, waiting ${delayMs}ms...`);
296
- await new Promise(resolve => setTimeout(resolve, delayMs));
297
- try {
298
- const retryResponse = await fetch(fullEndpoint, config);
299
- if (retryResponse.ok) {
300
- console.log(`✅ 503 retry attempt ${attempt} succeeded`);
301
- const rawData = await retryResponse.json();
302
- resetAuthFailureState();
303
- // COMPATIBILITY MODE: Handle both formats
304
- if (rawData && typeof rawData === 'object' && 'success' in rawData) {
305
- const validatedResponse = (0, api_responses_1.validateStandardizedResponse)(rawData, endpoint);
306
- return this.convertToApiResult(validatedResponse);
307
- }
308
- else {
309
- // New format - raw data
310
- const wrappedResponse = {
311
- success: true,
312
- data: rawData,
313
- message: 'Success',
314
- operation_code: 'RAW_RESPONSE',
315
- timestamp: new Date().toISOString()
316
- };
317
- return wrappedResponse;
318
- }
319
- }
320
- // If we get another 503, continue retrying
321
- if (retryResponse.status === 503) {
322
- console.log(`🔄 503 retry attempt ${attempt} got another 503, will retry...`);
323
- continue;
324
- }
325
- // If we get a different error, break and handle it normally
326
- console.log(`❌ 503 retry attempt ${attempt} got ${retryResponse.status}, stopping retries`);
327
- // Fall through to handle the retry response error
328
- const errorText = await retryResponse.text();
329
- let errorData;
330
- try {
331
- errorData = JSON.parse(errorText);
332
- if (errorData && typeof errorData === 'object' && 'success' in errorData) {
333
- // Detect PayEz canonical error envelope and map accordingly
334
- if (errorData.error && typeof errorData.error === 'object') {
335
- const reqIdHeader = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
336
- const reqIdBody = errorData?.request_id || errorData?.requestId;
337
- const errorResult = {
338
- success: false,
339
- error_code: errorData?.error?.code || errorData?.error_code || errorData?.code || `HTTP_${retryResponse.status}`,
340
- message: errorData?.error?.message || errorData?.message || `Request failed with status ${retryResponse.status}`,
341
- operation: endpoint,
342
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
343
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
344
- };
345
- return errorResult;
346
- }
347
- // Otherwise attempt to validate as our standardized error shape
348
- const validatedError = (0, api_responses_1.validateStandardizedResponse)(errorData, endpoint);
349
- return this.convertToApiResult(validatedError);
350
- }
351
- else {
352
- // New/unknown error format - best-effort mapping
353
- const reqIdHeader = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
354
- const reqIdBody = errorData?.request_id || errorData?.requestId;
355
- const errorResult = {
356
- success: false,
357
- error_code: errorData?.error_code || errorData?.code || `HTTP_${retryResponse.status}`,
358
- message: errorData?.message || (typeof errorData?.error === 'string' ? errorData.error : errorData?.error?.message) || errorText || `Request failed with status ${retryResponse.status}`,
359
- operation: endpoint,
360
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
361
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
362
- };
363
- return errorResult;
364
- }
365
- }
366
- catch {
367
- const reqIdHeader2 = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
368
- const errorResult = {
369
- success: false,
370
- error_code: `HTTP_${retryResponse.status}`,
371
- message: errorText || `Request failed with status ${retryResponse.status}`,
372
- operation: endpoint,
373
- ...(reqIdHeader2 ? { request_id: reqIdHeader2 } : {})
374
- };
375
- return errorResult;
376
- }
377
- }
378
- catch (retryError) {
379
- console.log(`❌ 503 retry attempt ${attempt} failed with network error:`, retryError);
380
- if (attempt === maxRetries) {
381
- // If all retries failed with network errors, throw the original error
382
- throw new ApiNetworkError('Service temporarily unavailable after retries', 503, endpoint);
383
- }
384
- continue;
385
- }
386
- }
387
- // If we got here, all retries failed - fall through to normal error handling
388
- console.log('❌ All 503 retry attempts exhausted, treating as error');
389
- }
390
- // Handle authentication errors with a single refresh+retry
391
- if (response.status === 401) {
392
- console.log('🔑 Got 401, checking if we have a session to refresh...');
393
- // CRITICAL FIX: Check if we actually have a session before attempting refresh
394
- const currentSession = await (0, react_1.getSession)();
395
- if (!currentSession || !currentSession.accessToken) {
396
- console.log('🚫 No valid session found, redirecting to login instead of refresh');
397
- scheduleLoginRedirect(true); // Immediate redirect
398
- throw new ApiNetworkError('Authentication required - no valid session', 401, endpoint);
399
- }
400
- // Elegantly gate refresh during pre-2FA or when no refresh token exists
401
- const pre2FA_now = isPreTwoFactorSession(currentSession);
402
- const hasRefresh_now = !!currentSession?.refreshToken;
403
- if (pre2FA_now || !hasRefresh_now) {
404
- console.log('⏭️ Skipping 401-driven refresh:', {
405
- reason: pre2FA_now ? 'pre-2FA session' : 'no refresh token',
406
- requiresTwoFactor: currentSession?.user?.requiresTwoFactor,
407
- twoFactorVerified: currentSession?.user?.twoFactorSessionVerified,
408
- hasRefreshToken: hasRefresh_now
409
- });
410
- // CRITICAL: Redirect to login immediately if refresh is impossible
411
- console.log('🚫 Cannot refresh session, redirecting to login');
412
- scheduleLoginRedirect(true); // Immediate redirect
413
- throw new ApiNetworkError(pre2FA_now
414
- ? 'Two-factor authentication required'
415
- : 'Session expired - refresh token unavailable', 401, endpoint);
416
- }
417
- console.log('🔑 Valid session found, attempting token refresh...');
418
- // Try to refresh the token, but coordinate to avoid double refresh
419
- if (!refreshInFlight) {
420
- refreshInFlight = (async () => {
421
- const reqId = crypto.randomUUID();
422
- const refreshResponse = await fetch('/api/auth/refresh', {
423
- method: 'POST',
424
- credentials: 'include',
425
- headers: { 'X-Request-ID': reqId },
426
- });
427
- if (refreshResponse.ok) {
428
- console.log('✅ Token refreshed successfully (client-side coordinator)');
429
- return true;
430
- }
431
- // If refresh is already in progress server-side, wait briefly and allow retry
432
- if (refreshResponse.status === 409) {
433
- console.log('↪️ Refresh in progress server-side (409). Waiting for completion...');
434
- await new Promise(r => setTimeout(r, 1500));
435
- return true;
436
- }
437
- // For auth failures, schedule redirect; for others, throw
438
- if (refreshResponse.status === 401 || refreshResponse.status === 403) {
439
- scheduleLoginRedirect();
440
- throw new ApiNetworkError('Authentication failed - unable to refresh session', refreshResponse.status, endpoint);
441
- }
442
- const errorText = await refreshResponse.text();
443
- throw new ApiNetworkError(errorText || 'Token refresh failed', refreshResponse.status, endpoint);
444
- })().finally(() => { refreshInFlight = null; });
445
- }
446
- try {
447
- await refreshInFlight;
448
- }
449
- catch (e) {
450
- throw e; // bubble up to caller handling
451
- }
452
- console.log('🔁 Retrying original request after coordinated refresh...');
453
- // Get the new session and retry the original request
454
- const newSession = await (0, react_1.getSession)();
455
- const newToken = newSession?.accessToken;
456
- const retryConfig = {
457
- ...options,
458
- headers: {
459
- 'Content-Type': 'application/json',
460
- ...(newToken && { 'Authorization': `Bearer ${newToken}` }),
461
- ...options.headers,
462
- },
463
- };
464
- const retryResponse = await fetch(fullEndpoint, retryConfig);
465
- if (retryResponse.ok) {
466
- const rawData = await retryResponse.json();
467
- // Reset auth failure state on successful retry
468
- resetAuthFailureState();
469
- // COMPATIBILITY MODE: Handle both formats in retry as well
470
- if (rawData && typeof rawData === 'object' && 'success' in rawData) {
471
- const validatedResponse = (0, api_responses_1.validateStandardizedResponse)(rawData, endpoint);
472
- return this.convertToApiResult(validatedResponse);
473
- }
474
- else {
475
- // New format - raw data
476
- console.log(`🔄 Converting raw retry response to standardized format for ${endpoint}`);
477
- const wrappedResponse = {
478
- success: true,
479
- data: rawData,
480
- message: 'Success',
481
- operation_code: 'RAW_RESPONSE',
482
- timestamp: new Date().toISOString()
483
- };
484
- return wrappedResponse;
485
- }
486
- }
487
- else {
488
- // If retry still 401, schedule redirect
489
- if (retryResponse.status === 401) {
490
- scheduleLoginRedirect();
491
- }
492
- const errorText = await retryResponse.text();
493
- let errorData;
494
- try {
495
- errorData = JSON.parse(errorText);
496
- // Check if it has the success field (old format)
497
- if (errorData && typeof errorData === 'object' && 'success' in errorData) {
498
- // Detect PayEz canonical error envelope and map accordingly
499
- if (errorData.error && typeof errorData.error === 'object') {
500
- const reqIdHeader = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
501
- const reqIdBody = errorData?.request_id || errorData?.requestId;
502
- const errorResult = {
503
- success: false,
504
- error_code: errorData?.error?.code || errorData?.error_code || errorData?.code || `HTTP_${retryResponse.status}`,
505
- message: errorData?.error?.message || errorData?.message || `Request failed with status ${retryResponse.status}`,
506
- operation: endpoint,
507
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
508
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
509
- };
510
- return errorResult;
511
- }
512
- const validatedError = (0, api_responses_1.validateStandardizedResponse)(errorData, endpoint);
513
- return this.convertToApiResult(validatedError);
514
- }
515
- else {
516
- // New format - convert raw error to standardized format
517
- const reqIdHeader = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
518
- const reqIdBody = errorData?.request_id || errorData?.requestId;
519
- const errorResult = {
520
- success: false,
521
- error_code: errorData?.error_code || errorData?.code || `HTTP_${retryResponse.status}`,
522
- message: errorData?.message || (typeof errorData?.error === 'string' ? errorData.error : errorData?.error?.message) || errorText || `Request failed with status ${retryResponse.status}`,
523
- operation: endpoint,
524
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
525
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
526
- };
527
- return errorResult;
528
- }
529
- }
530
- catch {
531
- // If we can't parse the error, create a generic error response
532
- const reqIdHeader = retryResponse.headers.get('X-Request-ID') || retryResponse.headers.get('X-Correlation-ID');
533
- const errorResult = {
534
- success: false,
535
- error_code: `HTTP_${retryResponse.status}`,
536
- message: errorText || `Request failed with status ${retryResponse.status}`,
537
- operation: endpoint,
538
- ...(reqIdHeader ? { request_id: reqIdHeader } : {})
539
- };
540
- return errorResult;
541
- }
542
- }
543
- }
544
- // Non-401 error: try to parse as standardized error response
545
- const errorText = await response.text();
546
- let errorData;
547
- try {
548
- errorData = JSON.parse(errorText);
549
- // Check if it has the success field (old format)
550
- if (errorData && typeof errorData === 'object' && 'success' in errorData) {
551
- // Detect PayEz canonical error envelope and map accordingly
552
- if (errorData.error && typeof errorData.error === 'object') {
553
- const reqIdHeader = response.headers.get('X-Request-ID') || response.headers.get('X-Correlation-ID');
554
- const reqIdBody = errorData?.request_id || errorData?.requestId;
555
- const errorResult = {
556
- success: false,
557
- error_code: errorData?.error?.code || errorData?.error_code || errorData?.code || `HTTP_${response.status}`,
558
- message: errorData?.error?.message || errorData?.message || `Request failed with status ${response.status}`,
559
- operation: endpoint,
560
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
561
- validation_errors: errorData?.validation_errors || undefined,
562
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
563
- };
564
- return errorResult;
565
- }
566
- const validatedError = (0, api_responses_1.validateStandardizedResponse)(errorData, endpoint);
567
- return this.convertToApiResult(validatedError);
568
- }
569
- else {
570
- // New format - convert raw error to standardized format
571
- const reqIdHeader = response.headers.get('X-Request-ID') || response.headers.get('X-Correlation-ID');
572
- const reqIdBody = errorData?.request_id || errorData?.requestId;
573
- const errorResult = {
574
- success: false,
575
- error_code: errorData?.error_code || errorData?.code || `HTTP_${response.status}`,
576
- message: errorData?.message || (typeof errorData?.error === 'string' ? errorData.error : errorData?.error?.message) || errorText || `Request failed with status ${response.status}`,
577
- operation: endpoint,
578
- details: (errorData?.error?.details ?? errorData?.details) || undefined,
579
- validation_errors: errorData?.validation_errors || undefined,
580
- ...(reqIdBody || reqIdHeader ? { request_id: (reqIdBody || reqIdHeader) } : {})
581
- };
582
- return errorResult;
583
- }
584
- }
585
- catch (parseError) {
586
- // If we can't parse the error, create a generic error response
587
- const reqIdHeader = response.headers.get('X-Request-ID') || response.headers.get('X-Correlation-ID');
588
- const errorResult = {
589
- success: false,
590
- error_code: `HTTP_${response.status}`,
591
- message: errorText || `Request failed with status ${response.status}`,
592
- operation: endpoint,
593
- details: undefined,
594
- ...(reqIdHeader ? { request_id: reqIdHeader } : {})
595
- };
596
- return errorResult;
597
- }
598
- }
599
- // SUCCESS PATH: Parse and validate response
600
- const rawData = await response.json();
601
- // Reset auth failure state on successful request
602
- resetAuthFailureState();
603
- // COMPATIBILITY MODE: Handle both old envelope format and new raw format
604
- try {
605
- // First check if it's the old standardized format with success field
606
- if (rawData && typeof rawData === 'object' && 'success' in rawData) {
607
- // Old format - validate as standardized response
608
- const validatedResponse = (0, api_responses_1.validateStandardizedResponse)(rawData, endpoint);
609
- return this.convertToApiResult(validatedResponse);
610
- }
611
- else {
612
- // New format - raw data, wrap it in success envelope for compatibility
613
- console.log(`🔄 Converting raw response to standardized format for ${endpoint}`);
614
- const wrappedResponse = {
615
- success: true,
616
- data: rawData,
617
- message: 'Success',
618
- operation_code: 'RAW_RESPONSE',
619
- timestamp: new Date().toISOString()
620
- };
621
- return wrappedResponse;
622
- }
623
- }
624
- catch (validationError) {
625
- // If response format is invalid, this is a CRITICAL error
626
- throw new ApiResponseFormatError(validationError instanceof Error ? validationError.message : 'Response format validation failed', endpoint, rawData);
627
- }
628
- }
629
- catch (error) {
630
- // Re-throw our custom errors as-is
631
- if (error instanceof ApiResponseFormatError ||
632
- error instanceof ApiBusinessLogicError ||
633
- error instanceof ApiValidationError ||
634
- error instanceof ApiNetworkError) {
635
- throw error;
636
- }
637
- // Wrap unknown errors as network errors
638
- console.error('❌ API request failed:', error);
639
- throw new ApiNetworkError(error instanceof Error ? error.message : 'Network error', 0, endpoint);
640
- }
641
- }
642
- /**
643
- * CONVERTS VALIDATED STANDARDIZED RESPONSE TO CLIENT RESULT
644
- * This normalizes the response for client consumption
645
- */
646
- convertToApiResult(validatedResponse) {
647
- if ((0, api_responses_1.isSuccessResponse)(validatedResponse)) {
648
- return {
649
- success: true,
650
- data: validatedResponse.data,
651
- message: validatedResponse.message,
652
- operation_code: validatedResponse.operation_code,
653
- timestamp: validatedResponse.timestamp
654
- };
655
- }
656
- if ((0, api_responses_1.isPagedResponse)(validatedResponse)) {
657
- return {
658
- success: true,
659
- items: validatedResponse.data,
660
- message: validatedResponse.message,
661
- operation_code: validatedResponse.operation_code,
662
- pagination: validatedResponse.pagination,
663
- timestamp: validatedResponse.timestamp
664
- };
665
- }
666
- if ((0, api_responses_1.isErrorResponse)(validatedResponse)) {
667
- const reqId = validatedResponse?.request_id || validatedResponse?.requestId;
668
- if (validatedResponse.error_code === 'VALIDATION_ERROR') {
669
- // Handle validation error
670
- const valError = validatedResponse;
671
- return {
672
- success: false,
673
- error_code: validatedResponse.error_code,
674
- message: validatedResponse.message,
675
- operation: validatedResponse.operation,
676
- details: validatedResponse.details,
677
- validation_errors: valError.payload?.validation_errors,
678
- ...(reqId ? { request_id: reqId } : {})
679
- };
680
- }
681
- else {
682
- // Handle regular error
683
- return {
684
- success: false,
685
- error_code: validatedResponse.error_code,
686
- message: validatedResponse.message,
687
- operation: validatedResponse.operation,
688
- details: validatedResponse.details,
689
- ...(reqId ? { request_id: reqId } : {})
690
- };
691
- }
692
- }
693
- // This should never happen due to validation, but TypeScript requires it
694
- throw new ApiResponseFormatError('Unknown response type after validation', 'unknown', validatedResponse);
695
- }
696
- // ========================================================================================
697
- // HTTP METHOD WRAPPERS - PUBLIC API
698
- // ========================================================================================
699
- /**
700
- * GET REQUEST - Returns typed result with direct data access
701
- */
702
- async get(endpoint, sessionToken) {
703
- return this.makeRequest(endpoint, { method: 'GET' }, sessionToken);
704
- }
705
- /**
706
- * POST REQUEST - Returns typed result with direct data access
707
- */
708
- async post(endpoint, data, sessionToken) {
709
- return this.makeRequest(endpoint, {
710
- method: 'POST',
711
- body: data ? JSON.stringify(data) : undefined,
712
- }, sessionToken);
713
- }
714
- /**
715
- * PUT REQUEST - Returns typed result with direct data access
716
- */
717
- async put(endpoint, data, sessionToken) {
718
- return this.makeRequest(endpoint, {
719
- method: 'PUT',
720
- body: data ? JSON.stringify(data) : undefined,
721
- }, sessionToken);
722
- }
723
- /**
724
- * DELETE REQUEST - Returns typed result with direct data access
725
- */
726
- async delete(endpoint) {
727
- return this.makeRequest(endpoint, { method: 'DELETE' });
728
- }
729
- }
730
- // ========================================================================================
731
- // SINGLETON INSTANCE - READY TO USE
732
- // ========================================================================================
733
- exports.standardizedApi = new StandardizedClientApiService();
734
- // ========================================================================================
735
- // CONVENIENCE HELPER FUNCTIONS
736
- // ========================================================================================
737
- /**
738
- * TYPE-SAFE SUCCESS CHECK
739
- * Use this to check if API call was successful with proper type narrowing
740
- */
741
- function isApiSuccess(result) {
742
- return result.success === true && 'data' in result;
743
- }
744
- /**
745
- * TYPE-SAFE PAGED SUCCESS CHECK
746
- * Use this to check if API call was successful paged response with proper type narrowing
747
- */
748
- function isApiPagedSuccess(result) {
749
- return result.success === true && 'items' in result;
750
- }
751
- /**
752
- * TYPE-SAFE ERROR CHECK
753
- * Use this to check if API call failed with proper type narrowing
754
- */
755
- function isApiError(result) {
756
- return result.success === false;
757
- }
758
- /**
759
- * EXTRACT DATA FROM SUCCESS RESULT
760
- * Use this to get the data from a successful API call
761
- * Will throw if result is not successful
762
- */
763
- function extractApiData(result) {
764
- if (isApiSuccess(result)) {
765
- return result.data;
766
- }
767
- if (isApiPagedSuccess(result)) {
768
- return result.items;
769
- }
770
- throw new ApiBusinessLogicError(result.error_code, result.message, result.operation, result.details);
771
- }
772
- /**
773
- * EXTRACT ITEMS FROM PAGED SUCCESS RESULT
774
- * Use this to get the items array from a successful paged API call
775
- * Will throw if result is not successful paged response
776
- */
777
- function extractApiItems(result) {
778
- if (isApiPagedSuccess(result)) {
779
- return result.items;
780
- }
781
- if (isApiSuccess(result)) {
782
- // If it's a regular success but expected paged, data should be array
783
- return result.data;
784
- }
785
- throw new ApiBusinessLogicError(result.error_code, result.message, result.operation, result.details);
786
- }