static void IceCandidateCallback(IntPtr userData, IceCandidate iceCandidate)
        {
            var source = GCHandleHelper.FromIntPtr <PeerConnectionObserver>(userData);

            source?.IceCandidateAdded?.Invoke(
                source,
                new EventArgs <RTCIceCandidate>(GetRTCIceCandidate(iceCandidate)));
        }
        static void IceCandidatesRemovedCallback(IntPtr userData, IntPtr candidates)
        {
            var source = GCHandleHelper.FromIntPtr <PeerConnectionObserver>(userData);

            source?.IceCandidatesRemoved?.Invoke(source, new EventArgs <IntPtr>(candidates));
        }
        static void RenegotiationNeededCallback(IntPtr userData)
        {
            var source = GCHandleHelper.FromIntPtr <PeerConnectionObserver>(userData);

            source?.RenegotiationNeeded?.Invoke(source, EventArgs.Empty);
        }
        static void IceGatheringStateChangedCallback(IntPtr userData, RTCIceGatheringState state)
        {
            var source = GCHandleHelper.FromIntPtr <PeerConnectionObserver>(userData);

            source?.IceGatheringStateChanged?.Invoke(source, new EventArgs <RTCIceGatheringState>(state));
        }