anchor.diff:      },
       "optional": [],
     };
  +
  +  RTCSignalingState get signalingState => _signalingState;
  +
  +  RTCIceGatheringState get iceGatheringState => _iceGatheringState;
  +
  +  RTCIceConnectionState get iceConnectionState => _iceConnectionState;
   
     RTCPeerConnection(this._jsPc) {
       _jsPc.onAddStream.listen((mediaStreamEvent) {
  
positive.code:  */
  class RTCPeerConnection {
    final HTML.RtcPeerConnection _jsPc;
  
    // public: delegate
    SignalingStateCallback onSignalingState;
  
negative.code:     });
      _jsPc.onIceConnectionStateChange.listen((_) {
        if (onIceConnectionState != null) {
          _iceConnectionState =
              iceConnectionStateForString(_jsPc.iceConnectionState);
          onIceConnectionState(_iceConnectionState);
        }
      });
      JS.JsObject.fromBrowserObject(_jsPc)['onicegatheringstatechange'] =
          JS.JsFunction.withThis((_) {
        if (onIceGatheringState != null) {
          _iceGatheringState =
              iceGatheringStateforString(_jsPc.iceGatheringState);
          onIceGatheringState(_iceGatheringState);
        }
      });
      _jsPc.onRemoveStream.listen((mediaStreamEvent) {
  