private async Task InitializeORTC()
        {
            var gatherOptions = new RTCIceGatherOptions()
            {
                IceServers = new List <RTCIceServer>()
                {
                    new RTCIceServer
                    {
                        Urls = new string[] { _stunUrl }
                    },
                    new RTCIceServer
                    {
                        Username       = _turnUsername,
                        Credential     = _turnCredential,
                        CredentialType = RTCIceCredentialType.Password,
                        Urls           = new string[] { _turnUrl }
                    }
                }
            };

            _gatherer = new RTCIceGatherer(gatherOptions);

            _gatherer.OnStateChange += IceGatherer_OnStateChange;

            _gatherer.OnLocalCandidate += (@event) =>
            {
                OnSignalMessageToPeer(@event.Candidate.ToJson().ToString());
            };
            _gatherer.OnLocalCandidateComplete += (@event) =>
            {
                OnSignalMessageToPeer(@event.Candidate.ToJson().ToString());
            };

            _ice = new RTCIceTransport(_gatherer);
            _ice.OnStateChange += IceTransport_OnStateChange;

            _dtls = new RTCDtlsTransport(_ice, new RTCCertificate[]
            {
                await RTCCertificate.GenerateCertificate()
            });
            _dtls.OnStateChange += Dtls_OnStateChange;

            _sctp = new RTCSctpTransport(_dtls);

            _gatherer.Gather(null);
        }
        /// <summary>
        /// Estabilishes a DataChannel with the parameter peer.
        /// </summary>
        private async Task OpenDataChannel(Peer peer)
        {
            Debug.WriteLine($"Opening data channel to peer: {peer.Name}");

            Conversation = string.Empty;

            Debug.WriteLine("Ice: Gathering candidates.");
            _gatherer.Gather(null);

            var iceParams = _gatherer.GetLocalParameters();
            await _signaler.SendToPeer(peer.Id, iceParams.ToJsonString());

            // this order guarantees: alice -> bob; bob.start(); bob -> alice; alice.start(); alice -> datachannel -> bob
            if (_isInitiator)
            {
                var sctpCaps = RTCSctpTransport.GetCapabilities();
                await _signaler.SendToPeer(peer.Id, sctpCaps.ToJsonString());
            }

            var dtlsParams = _dtls.GetLocalParameters();
            await _signaler.SendToPeer(peer.Id, dtlsParams.ToJsonString());
        }