fix(nuxt): use max length + iterations for useCookie timeout (#24253)

This commit is contained in:
Christian Gil 2023-11-20 11:58:52 -06:00 committed by GitHub
parent 7863981762
commit a10e33c009
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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
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()
}