rsnext/packages/next/client/request-idle-callback.ts
Joe Haddad 5f41abda9a
fix(link): cancel idle callback on unmount (#22072)
Co-authored-by: mAAdhaTTah <jamesorodig@gmail.com>
2021-02-11 13:51:41 -05:00

40 lines
1 KiB
TypeScript

type RequestIdleCallbackHandle = any
type RequestIdleCallbackOptions = {
timeout: number
}
type RequestIdleCallbackDeadline = {
readonly didTimeout: boolean
timeRemaining: () => number
}
declare global {
interface Window {
requestIdleCallback: (
callback: (deadline: RequestIdleCallbackDeadline) => void,
opts?: RequestIdleCallbackOptions
) => RequestIdleCallbackHandle
cancelIdleCallback: (id: RequestIdleCallbackHandle) => void
}
}
export const requestIdleCallback =
(typeof self !== 'undefined' && self.requestIdleCallback) ||
function (
cb: (deadline: RequestIdleCallbackDeadline) => void
): NodeJS.Timeout {
let start = Date.now()
return setTimeout(function () {
cb({
didTimeout: false,
timeRemaining: function () {
return Math.max(0, 50 - (Date.now() - start))
},
})
}, 1)
}
export const cancelIdleCallback =
(typeof self !== 'undefined' && self.cancelIdleCallback) ||
function (id: RequestIdleCallbackHandle) {
return clearTimeout(id)
}