Skip to content

Commit fe1f79e

Browse files
authored
Merge pull request #17 from flutter-webrtc/fix/connection-state-for-firefox
fix: Convert iceconnectionstate to connectionstate for Firefox.
2 parents 4ff710a + 1a08035 commit fe1f79e

File tree

3 files changed

+84
-13
lines changed

3 files changed

+84
-13
lines changed

lib/src/rtc_peerconnection_impl.dart

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'dart:async';
22
import 'dart:html' as html;
33
import 'dart:js' as js;
44
import 'dart:js_util' as jsutil;
5+
6+
import 'package:platform_detect/platform_detect.dart';
57
import 'package:webrtc_interface/webrtc_interface.dart';
68

79
import 'media_stream_impl.dart';
@@ -72,6 +74,37 @@ class RTCPeerConnectionWeb extends RTCPeerConnection {
7274
_iceConnectionState =
7375
iceConnectionStateForString(_jsPc.iceConnectionState);
7476
onIceConnectionState?.call(_iceConnectionState!);
77+
78+
if (browser.isFirefox) {
79+
switch (_iceConnectionState!) {
80+
case RTCIceConnectionState.RTCIceConnectionStateNew:
81+
_connectionState = RTCPeerConnectionState.RTCPeerConnectionStateNew;
82+
break;
83+
case RTCIceConnectionState.RTCIceConnectionStateChecking:
84+
_connectionState =
85+
RTCPeerConnectionState.RTCPeerConnectionStateConnecting;
86+
break;
87+
case RTCIceConnectionState.RTCIceConnectionStateConnected:
88+
_connectionState =
89+
RTCPeerConnectionState.RTCPeerConnectionStateConnected;
90+
break;
91+
case RTCIceConnectionState.RTCIceConnectionStateFailed:
92+
_connectionState =
93+
RTCPeerConnectionState.RTCPeerConnectionStateFailed;
94+
break;
95+
case RTCIceConnectionState.RTCIceConnectionStateDisconnected:
96+
_connectionState =
97+
RTCPeerConnectionState.RTCPeerConnectionStateDisconnected;
98+
break;
99+
case RTCIceConnectionState.RTCIceConnectionStateClosed:
100+
_connectionState =
101+
RTCPeerConnectionState.RTCPeerConnectionStateClosed;
102+
break;
103+
default:
104+
break;
105+
}
106+
onConnectionState?.call(_connectionState!);
107+
}
75108
});
76109

77110
jsutil.setProperty(_jsPc, 'onicegatheringstatechange', js.allowInterop((_) {
@@ -94,10 +127,12 @@ class RTCPeerConnectionWeb extends RTCPeerConnection {
94127
onSignalingState?.call(_signalingState!);
95128
});
96129

97-
_jsPc.onConnectionStateChange.listen((_) {
98-
_connectionState = peerConnectionStateForString(_jsPc.connectionState);
99-
onConnectionState?.call(_connectionState!);
100-
});
130+
if (!browser.isFirefox) {
131+
_jsPc.onConnectionStateChange.listen((_) {
132+
_connectionState = peerConnectionStateForString(_jsPc.connectionState);
133+
onConnectionState?.call(_connectionState!);
134+
});
135+
}
101136

102137
_jsPc.onNegotiationNeeded.listen((_) {
103138
onRenegotiationNeeded?.call();

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ environment:
77
sdk: '>=2.13.0 <3.0.0'
88

99
dependencies:
10+
platform_detect: ^2.0.7
1011
webrtc_interface: ^1.0.10
1112

1213
dev_dependencies:

web/main.dart

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,29 @@ void loopBackTest() async {
2525
var localVideo = RTCVideoElement();
2626
local!.append(localVideo.htmlElement);
2727

28-
//var pc = await createPeerConnection({});
29-
//pc.onAddStream = (MediaStream stream) {};
28+
var remote = html.document.querySelector('#remote');
29+
var remotelVideo = RTCVideoElement();
30+
remote!.append(remotelVideo.htmlElement);
31+
32+
var pc2 = await createPeerConnection({});
33+
pc2.onTrack = (event) {
34+
if (event.track.kind == 'video') {
35+
remotelVideo.srcObject = event.streams[0];
36+
}
37+
};
38+
pc2.onConnectionState = (state) {
39+
print('connectionState $state');
40+
};
41+
42+
pc2.onIceConnectionState = (state) {
43+
print('iceConnectionState $state');
44+
};
45+
46+
var pc1 = await createPeerConnection({});
47+
48+
pc1.onIceCandidate = (candidate) => pc2.addCandidate(candidate);
49+
pc2.onIceCandidate = (candidate) => pc1.addCandidate(candidate);
50+
3051
var stream =
3152
await navigator.mediaDevices.getUserMedia({'audio': true, 'video': true});
3253
/*.getUserMedia(MediaStreamConstraints(audio: true, video: true))*/
@@ -56,12 +77,26 @@ void loopBackTest() async {
5677
}
5778
}
5879

59-
/*
60-
stream.oninactive = (Event event) {
61-
print('oninactive: stream.id => ${event.target.id}');
62-
localVideo.srcObject = null;
63-
};
64-
*/
65-
//await pc.addStream(stream);
80+
stream.getTracks().forEach((track) async {
81+
await pc1.addTrack(track, stream);
82+
});
83+
84+
var offer = await pc1.createOffer();
85+
86+
await pc2.addTransceiver(
87+
kind: RTCRtpMediaType.RTCRtpMediaTypeAudio,
88+
init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly));
89+
await pc2.addTransceiver(
90+
kind: RTCRtpMediaType.RTCRtpMediaTypeVideo,
91+
init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly));
92+
93+
await pc1.setLocalDescription(offer);
94+
await pc2.setRemoteDescription(offer);
95+
var answer = await pc2.createAnswer({});
96+
await pc2.setLocalDescription(answer);
97+
98+
await pc1.setRemoteDescription(answer);
99+
100+
localVideo.muted = true;
66101
localVideo.srcObject = stream;
67102
}

0 commit comments

Comments
 (0)