Skip to content

Commit

Permalink
fix(nuxt): use max length + iterations for useCookie timeout (#24253)
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisGV04 committed Nov 20, 2023
1 parent 7863981 commit a10e33c
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions packages/nuxt/src/app/composables/cookie.ts
Expand Up @@ -140,22 +140,43 @@ function writeServerCookie (event: H3Event, name: string, value: any, opts: Cook
}
}

/**
* The maximum value allowed on a timeout delay.
*
* Reference: https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value
*/
const MAX_TIMEOUT_DELAY = 2_147_483_647

// custom ref that will update the value to undefined if the cookie expires
function cookieRef<T> (value: T | undefined, delay: number) {
let timeout: NodeJS.Timeout
onScopeDispose(() => { clearTimeout(timeout) })
let elapsed = 0
if (getCurrentScope()) {
onScopeDispose(() => { clearTimeout(timeout) })
}

return customRef((track, trigger) => {
function createExpirationTimeout () {
clearTimeout(timeout)
const timeRemaining = delay - elapsed
const timeoutLength = timeRemaining < MAX_TIMEOUT_DELAY ? timeRemaining : MAX_TIMEOUT_DELAY
timeout = setTimeout(() => {
elapsed += timeoutLength
if (elapsed < delay) { return createExpirationTimeout() }

value = undefined
trigger()
}, timeoutLength)
}

return {
get () {
track()
return value
},
set (newValue) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = undefined
trigger()
}, delay)
createExpirationTimeout()

value = newValue
trigger()
}
Expand Down

0 comments on commit a10e33c

Please sign in to comment.