callback in nextTick so it can't corrupt client