private async void Signaler_OnMessage(Signaler.Message message) { switch (message.MessageType) { case Signaler.Message.WireMessageType.Offer: await _nativePeer.SetRemoteDescriptionAsync("offer", message.Data); // If we get an offer, we immediately send an answer back _nativePeer.CreateAnswer(); break; case Signaler.Message.WireMessageType.Answer: _ = _nativePeer.SetRemoteDescriptionAsync("answer", message.Data); break; case Signaler.Message.WireMessageType.Ice: // TODO - This is NodeDSS-specific // this "parts" protocol is defined above, in OnIceCandiateReadyToSend listener var parts = message.Data.Split(new string[] { message.IceDataSeparator }, StringSplitOptions.RemoveEmptyEntries); // Note the inverted arguments; candidate is last here, but first in OnIceCandiateReadyToSend _nativePeer.AddIceCandidate(parts[2], int.Parse(parts[1]), parts[0]); break; default: throw new InvalidOperationException($"Unhandled signaler message type '{message.MessageType}'"); } }