In this case, my server(Omniverse App, USD composer) is running behind a full cone NAT, and the client(browser) is running behind a Restricted Cone NAT. The procedure hung at the ICE stage, no oniceconnectionstatechange got called.
Here is the logs catpured at the blowser.
123.60.58.255-1695514724245.log (31.8 KB)