@@ -45,14 +45,16 @@ class Session {
4545}
4646
4747class Signaling {
48- JsonEncoder _encoder = new JsonEncoder ();
48+ Signaling (this ._host);
49+
50+ JsonEncoder _encoder = JsonEncoder ();
51+ JsonDecoder _decoder = JsonDecoder ();
4952 String _selfId = randomNumeric (6 );
5053 SimpleWebSocket _socket;
5154 var _host;
5255 var _port = 8086 ;
5356 var _turnCredential;
5457 Map <String , Session > _sessions = {};
55-
5658 MediaStream _localStream;
5759 List <MediaStream > _remoteStreams = < MediaStream > [];
5860
@@ -94,21 +96,8 @@ class Signaling {
9496 'optional' : [],
9597 };
9698
97- Signaling (this ._host);
98-
9999 close () async {
100- if (_localStream != null ) {
101- _localStream.getTracks ().forEach ((element) async {
102- await element.dispose ();
103- });
104- await _localStream.dispose ();
105- _localStream = null ;
106- }
107-
108- _sessions.forEach ((key, sess) async {
109- await sess.pc.close ();
110- });
111- _sessions.clear ();
100+ await _cleanSessions ();
112101 if (_socket != null ) _socket.close ();
113102 }
114103
@@ -146,7 +135,7 @@ class Signaling {
146135 'from' : _selfId,
147136 });
148137
149- _stopSession (_sessions[sessionId]);
138+ _closeSession (_sessions[sessionId]);
150139 }
151140
152141 void onMessage (message) async {
@@ -158,7 +147,7 @@ class Signaling {
158147 {
159148 List <dynamic > peers = data;
160149 if (onPeersUpdate != null ) {
161- Map <String , dynamic > event = new Map <String , dynamic >();
150+ Map <String , dynamic > event = Map <String , dynamic >();
162151 event['self' ] = _selfId;
163152 event['peers' ] = peers;
164153 onPeersUpdate? .call (event);
@@ -179,8 +168,8 @@ class Signaling {
179168 media: media,
180169 screenSharing: false );
181170 _sessions[sessionId] = newSession;
182- await newSession.pc.setRemoteDescription (new RTCSessionDescription (
183- description['sdp' ], description['type' ]));
171+ await newSession.pc.setRemoteDescription (
172+ RTCSessionDescription ( description['sdp' ], description['type' ]));
184173 await _createAnswer (newSession, media);
185174 if (newSession.remoteCandidates.length > 0 ) {
186175 newSession.remoteCandidates.forEach ((candidate) async {
@@ -196,8 +185,8 @@ class Signaling {
196185 var description = data['description' ];
197186 var sessionId = data['session_id' ];
198187 var session = _sessions[sessionId];
199- session? .pc? .setRemoteDescription (new RTCSessionDescription (
200- description['sdp' ], description['type' ]));
188+ session? .pc? .setRemoteDescription (
189+ RTCSessionDescription ( description['sdp' ], description['type' ]));
201190 }
202191 break ;
203192 case 'candidate' :
@@ -206,13 +195,15 @@ class Signaling {
206195 var candidateMap = data['candidate' ];
207196 var sessionId = data['session_id' ];
208197 var session = _sessions[sessionId];
209- RTCIceCandidate candidate = new RTCIceCandidate (
210- candidateMap['candidate' ],
211- candidateMap['sdpMid' ],
212- candidateMap['sdpMLineIndex' ]);
198+ RTCIceCandidate candidate = RTCIceCandidate (candidateMap['candidate' ],
199+ candidateMap['sdpMid' ], candidateMap['sdpMLineIndex' ]);
213200
214201 if (session != null ) {
215- await session.pc.addCandidate (candidate);
202+ if (session.pc != null ) {
203+ await session.pc.addCandidate (candidate);
204+ } else {
205+ session.remoteCandidates.add (candidate);
206+ }
216207 } else {
217208 _sessions[sessionId] = Session (pid: peerId, sid: sessionId)
218209 ..remoteCandidates.add (candidate);
@@ -222,7 +213,7 @@ class Signaling {
222213 case 'leave' :
223214 {
224215 var peerId = data as String ;
225- _cleanSession (peerId);
216+ _closeSessionByPeerId (peerId);
226217 }
227218 break ;
228219 case 'bye' :
@@ -231,7 +222,7 @@ class Signaling {
231222 print ('bye: ' + sessionId);
232223 var session = _sessions.remove (sessionId);
233224 onCallStateChange? .call (session, CallState .CallStateBye );
234- _stopSession (session);
225+ _closeSession (session);
235226 }
236227 break ;
237228 case 'keepalive' :
@@ -244,7 +235,7 @@ class Signaling {
244235 }
245236 }
246237
247- void connect () async {
238+ Future < void > connect () async {
248239 var url = 'https://$_host :$_port /ws' ;
249240 _socket = SimpleWebSocket (url);
250241
@@ -284,8 +275,7 @@ class Signaling {
284275
285276 _socket.onMessage = (message) {
286277 print ('Received data: ' + message);
287- JsonDecoder decoder = new JsonDecoder ();
288- onMessage (decoder.convert (message));
278+ onMessage (_decoder.convert (message));
289279 };
290280
291281 _socket.onClose = (int code, String reason) {
@@ -318,7 +308,7 @@ class Signaling {
318308 return stream;
319309 }
320310
321- _createSession (
311+ Future < Session > _createSession (
322312 {Session session,
323313 String peerId,
324314 String sessionId,
@@ -427,7 +417,7 @@ class Signaling {
427417 return newSession;
428418 }
429419
430- _addDataChannel (Session session, RTCDataChannel channel) {
420+ void _addDataChannel (Session session, RTCDataChannel channel) {
431421 channel.onDataChannelState = (e) {};
432422 channel.onMessage = (RTCDataChannelMessage data) {
433423 onDataChannelMessage? .call (session, channel, data);
@@ -436,15 +426,16 @@ class Signaling {
436426 onDataChannel? .call (session, channel);
437427 }
438428
439- _createDataChannel (Session session, {label: 'fileTransfer' }) async {
440- RTCDataChannelInit dataChannelDict = new RTCDataChannelInit ()
429+ Future <void > _createDataChannel (Session session,
430+ {label: 'fileTransfer' }) async {
431+ RTCDataChannelInit dataChannelDict = RTCDataChannelInit ()
441432 ..maxRetransmits = 30 ;
442433 RTCDataChannel channel =
443434 await session.pc.createDataChannel (label, dataChannelDict);
444435 _addDataChannel (session, channel);
445436 }
446437
447- _createOffer (Session session, String media) async {
438+ Future < void > _createOffer (Session session, String media) async {
448439 try {
449440 RTCSessionDescription s =
450441 await session.pc.createOffer (media == 'data' ? _dcConstraints : {});
@@ -461,7 +452,7 @@ class Signaling {
461452 }
462453 }
463454
464- _createAnswer (Session session, String media) async {
455+ Future < void > _createAnswer (Session session, String media) async {
465456 try {
466457 RTCSessionDescription s =
467458 await session.pc.createAnswer (media == 'data' ? _dcConstraints : {});
@@ -478,24 +469,41 @@ class Signaling {
478469 }
479470
480471 _send (event, data) {
481- var request = new Map ();
472+ var request = Map ();
482473 request["type" ] = event;
483474 request["data" ] = data;
484475 _socket.send (_encoder.convert (request));
485476 }
486477
487- _cleanSession (String peerId) {
478+ Future <void > _cleanSessions () async {
479+ if (_localStream != null ) {
480+ _localStream.getTracks ().forEach ((element) async {
481+ await element.dispose ();
482+ });
483+ await _localStream.dispose ();
484+ _localStream = null ;
485+ }
486+ _sessions.forEach ((key, sess) async {
487+ await sess? .pc? .close ();
488+ await sess? .dc? .close ();
489+ });
490+ _sessions.clear ();
491+ }
492+
493+ void _closeSessionByPeerId (String peerId) {
488494 var session;
489- _sessions.removeWhere ((String key, Session session ) {
495+ _sessions.removeWhere ((String key, Session sess ) {
490496 var ids = key.split ('-' );
497+ session = sess;
491498 return peerId == ids[0 ] || peerId == ids[1 ];
492499 });
493500 if (session != null ) {
501+ _closeSession (session);
494502 onCallStateChange? .call (session, CallState .CallStateBye );
495503 }
496504 }
497505
498- void _stopSession (Session session) async {
506+ Future < void > _closeSession (Session session) async {
499507 _localStream? .getTracks ()? .forEach ((element) async {
500508 await element.dispose ();
501509 });
0 commit comments