let refreshingPromise = null
const refreshToken = createEffect(() => new Promise(rs => setTimeout(rs, 1000, Math.floor(Math.random() * 10000))))
const token = restore(refreshToken, null)
const authenticate = attach({
effect: createEffect(async (token) => {
if (refreshingPromise) return refreshingPromise
return await (refreshingPromise = refreshToken())
refreshToken.watch(() => console.log('refreshing'))
authenticate.doneData.watch(token => console.log('authenticated ', token))
setTimeout(() => token.setState(null), 2000)
setTimeout(() => authenticate(), 2500)
setTimeout(() => authenticate(), 3000)
setTimeout(() => authenticate(), 4000)
setTimeout(() => authenticate(), 4500)