1
1
import 'dart:convert' ;
2
2
import 'dart:async' ;
3
+ import 'dart:io' ;
3
4
import 'package:flutter_webrtc/webrtc.dart' ;
4
5
import 'random_string.dart' ;
5
6
@@ -30,6 +31,8 @@ typedef void DataChannelMessageCallback(
30
31
typedef void DataChannelCallback (RTCDataChannel dc);
31
32
32
33
class Signaling {
34
+ JsonEncoder _encoder = new JsonEncoder ();
35
+ JsonDecoder _decoder = new JsonDecoder ();
33
36
String _selfId = randomNumeric (6 );
34
37
SimpleWebSocket _socket;
35
38
var _sessionId;
@@ -38,6 +41,7 @@ class Signaling {
38
41
var _peerConnections = new Map <String , RTCPeerConnection >();
39
42
var _dataChannels = new Map <String , RTCDataChannel >();
40
43
var _remoteCandidates = [];
44
+ var _turnCredential;
41
45
42
46
MediaStream _localStream;
43
47
List <MediaStream > _remoteStreams;
@@ -100,6 +104,17 @@ class Signaling {
100
104
if (_socket != null ) _socket.close ();
101
105
}
102
106
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
+
103
118
void switchCamera () {
104
119
if (_localStream != null ) {
105
120
_localStream.getVideoTracks ()[0 ].switchCamera ();
@@ -263,6 +278,28 @@ class Signaling {
263
278
264
279
print ('connect to $url ' );
265
280
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
+
266
303
_socket.onOpen = () {
267
304
print ('onOpen' );
268
305
this ? .onStateChange (SignalingState .ConnectionOpen );
@@ -405,7 +442,6 @@ class Signaling {
405
442
var request = new Map ();
406
443
request["type" ] = event;
407
444
request["data" ] = data;
408
- JsonEncoder encoder = new JsonEncoder ();
409
- _socket.send (encoder.convert (request));
445
+ _socket.send (_encoder.convert (request));
410
446
}
411
447
}
0 commit comments