Move ice candidate construction to a shared helper