11import 'dart:convert' ;
22import 'dart:async' ;
33import 'package:flutter_webrtc/webrtc.dart' ;
4+
45import 'random_string.dart' ;
56
67import '../utils/device_info.dart'
78 if (dart.library.js) '../utils/device_info_web.dart' ;
89import '../utils/websocket.dart'
910 if (dart.library.js) '../utils/websocket_web.dart' ;
11+ import '../utils/turn.dart'
12+ if (dart.library.js) '../utils/turn_web.dart' ;
1013
1114enum SignalingState {
1215 CallStateNew ,
@@ -30,14 +33,17 @@ typedef void DataChannelMessageCallback(
3033typedef void DataChannelCallback (RTCDataChannel dc);
3134
3235class Signaling {
36+ JsonEncoder _encoder = new JsonEncoder ();
37+ JsonDecoder _decoder = new JsonDecoder ();
3338 String _selfId = randomNumeric (6 );
3439 SimpleWebSocket _socket;
3540 var _sessionId;
3641 var _host;
37- var _port = 4443 ;
42+ var _port = 8086 ;
3843 var _peerConnections = new Map <String , RTCPeerConnection >();
3944 var _dataChannels = new Map <String , RTCDataChannel >();
4045 var _remoteCandidates = [];
46+ var _turnCredential;
4147
4248 MediaStream _localStream;
4349 List <MediaStream > _remoteStreams;
@@ -220,7 +226,6 @@ class Signaling {
220226 break ;
221227 case 'bye' :
222228 {
223- var from = data['from' ];
224229 var to = data['to' ];
225230 var sessionId = data['session_id' ];
226231 print ('bye: ' + sessionId);
@@ -259,11 +264,33 @@ class Signaling {
259264 }
260265
261266 void connect () async {
262- var url = 'wss ://$_host :$_port ' ;
267+ var url = 'https ://$_host :$_port /ws ' ;
263268 _socket = SimpleWebSocket (url);
264269
265270 print ('connect to $url ' );
266271
272+ if (_turnCredential == null ) {
273+ try {
274+ _turnCredential = await getTurnCredential (_host, _port);
275+ /*{
276+ "username": "1584195784:mbzrxpgjys",
277+ "password": "isyl6FF6nqMTB9/ig5MrMRUXqZg",
278+ "ttl": 86400,
279+ "uris": ["turn:127.0.0.1:19302?transport=udp"]
280+ }
281+ */
282+ _iceServers = {
283+ 'iceServers' : [
284+ {
285+ 'url' : _turnCredential['uris' ][0 ],
286+ 'username' : _turnCredential['username' ],
287+ 'credential' : _turnCredential['password' ]
288+ },
289+ ]
290+ };
291+ } catch (e) {}
292+ }
293+
267294 _socket.onOpen = () {
268295 print ('onOpen' );
269296 this ? .onStateChange (SignalingState .ConnectionOpen );
@@ -321,6 +348,7 @@ class Signaling {
321348 pc.onIceCandidate = (candidate) {
322349 _send ('candidate' , {
323350 'to' : id,
351+ 'from' : _selfId,
324352 'candidate' : {
325353 'sdpMLineIndex' : candidate.sdpMlineIndex,
326354 'sdpMid' : candidate.sdpMid,
@@ -375,6 +403,7 @@ class Signaling {
375403 pc.setLocalDescription (s);
376404 _send ('offer' , {
377405 'to' : id,
406+ 'from' : _selfId,
378407 'description' : {'sdp' : s.sdp, 'type' : s.type},
379408 'session_id' : this ._sessionId,
380409 'media' : media,
@@ -391,6 +420,7 @@ class Signaling {
391420 pc.setLocalDescription (s);
392421 _send ('answer' , {
393422 'to' : id,
423+ 'from' : _selfId,
394424 'description' : {'sdp' : s.sdp, 'type' : s.type},
395425 'session_id' : this ._sessionId,
396426 });
@@ -400,8 +430,9 @@ class Signaling {
400430 }
401431
402432 _send (event, data) {
403- data['type' ] = event;
404- JsonEncoder encoder = new JsonEncoder ();
405- _socket.send (encoder.convert (data));
433+ var request = new Map ();
434+ request["type" ] = event;
435+ request["data" ] = data;
436+ _socket.send (_encoder.convert (request));
406437 }
407438}
0 commit comments