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 // custom ref that will update the value to undefined if the cookie expires
function cookieRef<T> (value: T | undefined, delay: number) { function cookieRef<T> (value: T | undefined, delay: number) {
let timeout: NodeJS.Timeout let timeout: NodeJS.Timeout
onScopeDispose(() => { clearTimeout(timeout) }) let elapsed = 0
if (getCurrentScope()) {
onScopeDispose(() => { clearTimeout(timeout) })
}
return customRef((track, trigger) => { 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 { return {
get () { get () {
track() track()
return value return value
}, },
set (newValue) { set (newValue) {
clearTimeout(timeout) createExpirationTimeout()
timeout = setTimeout(() => {
value = undefined
trigger()
}, delay)
value = newValue value = newValue
trigger() trigger()
} }