Hi Alexey.
>>
Why this code work if ICEs don't exchange?
It is working because there are ICE candidates in the SDP.
You can verify it. As you wait for last ICE candidate then get the SDP . The SDP will have all the candidates. you don't need to send candidates with separate signaling message. This is called regular ICE
If you send candidates one by one by Signaling that is called trickle ICE.
Even it is possible to establish connection if only one side sends the candidate because of the support of peer reflexive candidates.
But it is not possible if none of them sends any candidate.
Thanks,
Shakeeb