|
1 | 1 | import { getHeader } from 'h3' |
2 | 2 | import authMiddleware from './middleware/auth' |
| 3 | +import type { RefreshHandler } from './types' |
| 4 | +import defaultRefreshHandler from './utils/refreshHandler' |
3 | 5 | import { getNitroRouteRules } from './utils/kit' |
4 | 6 | import { addRouteMiddleware, defineNuxtPlugin, useRuntimeConfig, useAuth, useAuthState } from '#imports' |
5 | 7 |
|
@@ -35,65 +37,21 @@ export default defineNuxtPlugin(async (nuxtApp) => { |
35 | 37 | } |
36 | 38 |
|
37 | 39 | // 2. Setup session maintanence, e.g., auto refreshing or refreshing on foux |
38 | | - const { enableRefreshOnWindowFocus, enableRefreshPeriodically } = |
39 | | - runtimeConfig.session |
40 | | - |
41 | | - // Listen for when the page is visible, if the user switches tabs |
42 | | - // and makes our tab visible again, re-fetch the session, but only if |
43 | | - // this feature is not disabled. |
44 | | - const visibilityHandler = () => { |
45 | | - if (enableRefreshOnWindowFocus && document.visibilityState === 'visible') { |
46 | | - getSession() |
47 | | - } |
48 | | - } |
49 | | - |
50 | | - // Refetch interval |
51 | | - let refetchIntervalTimer: ReturnType<typeof setInterval> |
52 | | - |
53 | | - // TODO: find more Generic method to start a Timer for the Refresh Token |
54 | | - // Refetch interval for local/refresh schema |
55 | | - let refreshTokenIntervalTimer: typeof refetchIntervalTimer |
| 40 | + const refreshHandler: RefreshHandler = |
| 41 | + typeof runtimeConfig.session.refreshHandler === 'undefined' |
| 42 | + ? defaultRefreshHandler |
| 43 | + : runtimeConfig.session.refreshHandler |
56 | 44 |
|
57 | 45 | nuxtApp.hook('app:mounted', () => { |
| 46 | + refreshHandler.init(runtimeConfig.session) |
58 | 47 | if (disableServerSideAuth) { |
59 | 48 | getSession() |
60 | 49 | } |
61 | | - |
62 | | - document.addEventListener('visibilitychange', visibilityHandler, false) |
63 | | - |
64 | | - if (enableRefreshPeriodically !== false) { |
65 | | - const intervalTime = |
66 | | - enableRefreshPeriodically === true ? 1000 : enableRefreshPeriodically |
67 | | - refetchIntervalTimer = setInterval(() => { |
68 | | - if (data.value) { |
69 | | - getSession() |
70 | | - } |
71 | | - }, intervalTime) |
72 | | - } |
73 | | - |
74 | | - if (runtimeConfig.provider.type === 'refresh') { |
75 | | - const intervalTime = runtimeConfig.provider.token.maxAgeInSeconds! * 1000 |
76 | | - const { refresh, refreshToken } = useAuth() |
77 | | - refreshTokenIntervalTimer = setInterval(() => { |
78 | | - if (refreshToken.value) { |
79 | | - refresh() |
80 | | - } |
81 | | - }, intervalTime) |
82 | | - } |
83 | 50 | }) |
84 | 51 |
|
85 | 52 | const _unmount = nuxtApp.vueApp.unmount |
86 | 53 | nuxtApp.vueApp.unmount = function () { |
87 | | - // Clear visibility handler |
88 | | - document.removeEventListener('visibilitychange', visibilityHandler, false) |
89 | | - |
90 | | - // Clear refetch interval |
91 | | - clearInterval(refetchIntervalTimer) |
92 | | - |
93 | | - // Clear refetch interval |
94 | | - if (refreshTokenIntervalTimer) { |
95 | | - clearInterval(refreshTokenIntervalTimer) |
96 | | - } |
| 54 | + refreshHandler.destroy() |
97 | 55 |
|
98 | 56 | // Clear session |
99 | 57 | lastRefreshedAt.value = undefined |
|
0 commit comments