11import 'dart:convert' ;
22import 'dart:async' ;
3+ import 'dart:io' ;
34import 'package:flutter_webrtc/webrtc.dart' ;
45import 'random_string.dart' ;
56
@@ -30,6 +31,8 @@ typedef void DataChannelMessageCallback(
3031typedef void DataChannelCallback (RTCDataChannel dc);
3132
3233class Signaling {
34+ JsonEncoder _encoder = new JsonEncoder ();
35+ JsonDecoder _decoder = new JsonDecoder ();
3336 String _selfId = randomNumeric (6 );
3437 SimpleWebSocket _socket;
3538 var _sessionId;
@@ -38,6 +41,7 @@ class Signaling {
3841 var _peerConnections = new Map <String , RTCPeerConnection >();
3942 var _dataChannels = new Map <String , RTCDataChannel >();
4043 var _remoteCandidates = [];
44+ var _turnCredential;
4145
4246 MediaStream _localStream;
4347 List <MediaStream > _remoteStreams;
@@ -100,6 +104,17 @@ class Signaling {
100104 if (_socket != null ) _socket.close ();
101105 }
102106
107+ getTurnCredential (String host) async {
108+ var httpClient = new HttpClient ();
109+ var uri = new Uri .http ('$host ' , '/api/turn' ,
110+ {'service' : 'turn' , 'username' : 'flutter-webrtc' });
111+ var request = await httpClient.getUrl (uri);
112+ var response = await request.close ();
113+ var responseBody = await response.transform (Utf8Decoder ()).join ();
114+ Map data = _decoder.convert (responseBody);
115+ return data;
116+ }
117+
103118 void switchCamera () {
104119 if (_localStream != null ) {
105120 _localStream.getVideoTracks ()[0 ].switchCamera ();
@@ -263,6 +278,28 @@ class Signaling {
263278
264279 print ('connect to $url ' );
265280
281+ if (_turnCredential == null ) {
282+ try {
283+ _turnCredential = await getTurnCredential (_host);
284+ /*{
285+ "username": "1584195784:mbzrxpgjys",
286+ "password": "isyl6FF6nqMTB9/ig5MrMRUXqZg",
287+ "ttl": 86400,
288+ "uris": ["turn:127.0.0.1:19302?transport=udp"]
289+ }
290+ */
291+ _iceServers = {
292+ 'iceServers' : [
293+ {
294+ 'url' : _turnCredential['uris' ][0 ],
295+ 'username' : _turnCredential['username' ],
296+ 'credential' : _turnCredential['password' ]
297+ },
298+ ]
299+ };
300+ } catch (e) {}
301+ }
302+
266303 _socket.onOpen = () {
267304 print ('onOpen' );
268305 this ? .onStateChange (SignalingState .ConnectionOpen );
@@ -405,7 +442,6 @@ class Signaling {
405442 var request = new Map ();
406443 request["type" ] = event;
407444 request["data" ] = data;
408- JsonEncoder encoder = new JsonEncoder ();
409- _socket.send (encoder.convert (request));
445+ _socket.send (_encoder.convert (request));
410446 }
411447}
0 commit comments