22
22
* SOFTWARE.
23
23
*/
24
24
25
- import 'dart:convert' ;
26
25
import 'dart:async' ;
27
- import 'package:flutter_webrtc/webrtc. dart' ;
26
+ import 'dart:convert ' ;
28
27
29
- import 'random_string .dart' ;
28
+ import 'package:flutter_webrtc/webrtc .dart' ;
30
29
31
30
import '../../utils/device_info.dart' ;
32
- import '../../utils/websocket.dart' ;
33
31
import '../../utils/turn.dart' ;
32
+ import '../../utils/websocket.dart' ;
33
+ import 'random_string.dart' ;
34
34
35
35
enum SignalingState {
36
36
CallStateNew ,
@@ -61,11 +61,11 @@ class Signaling {
61
61
var _sessionId;
62
62
var _host;
63
63
var _port = 3000 ;
64
- // var _port = 8086;
65
64
var _peerConnections = new Map <String , RTCPeerConnection >();
66
65
var _dataChannels = new Map <String , RTCDataChannel >();
67
66
var _remoteCandidates = [];
68
67
var _turnCredential;
68
+ String calleeId;
69
69
70
70
MediaStream _localStream;
71
71
List <MediaStream > _remoteStreams;
@@ -157,28 +157,16 @@ class Signaling {
157
157
});
158
158
}
159
159
160
- void onMessage (message) async {
161
- Map <String , dynamic > mapData = message;
162
- var data = mapData['data' ];
160
+ void onMessage (tag, message) async {
161
+ JsonDecoder decoder = new JsonDecoder ();
163
162
164
- switch (mapData['type' ]) {
165
- case 'peers' :
166
- {
167
- List <dynamic > peers = data;
168
- if (this .onPeersUpdate != null ) {
169
- Map <String , dynamic > event = new Map <String , dynamic >();
170
- event['self' ] = _selfId;
171
- event['peers' ] = peers;
172
- this .onPeersUpdate (event);
173
- }
174
- }
175
- break ;
176
- case 'offer' :
163
+ switch (tag) {
164
+ case OFFER_EVENT :
177
165
{
178
- var id = data[ 'from' ] ;
179
- var description = data[ 'description' ] ;
180
- var media = data[ 'media' ] ;
181
- var sessionId = data[ 'session_id' ] ;
166
+ var id = 'caller' ;
167
+ var description = message ;
168
+ var media = 'call' ;
169
+ var sessionId = 'session_id' ;
182
170
this ._sessionId = sessionId;
183
171
184
172
if (this .onStateChange != null ) {
@@ -198,10 +186,10 @@ class Signaling {
198
186
}
199
187
}
200
188
break ;
201
- case 'answer' :
189
+ case ANSWER_EVENT :
202
190
{
203
- var id = data[ 'from' ] ;
204
- var description = data[ 'description' ] ;
191
+ var id = 'callee' ;
192
+ var description = message ;
205
193
206
194
var pc = _peerConnections[id];
207
195
if (pc != null ) {
@@ -210,24 +198,42 @@ class Signaling {
210
198
}
211
199
}
212
200
break ;
213
- case 'candidate' :
201
+ case ICE_CANDIDATE_EVENT :
214
202
{
215
- var id = data['from' ];
216
- var candidateMap = data['candidate' ];
217
- var pc = _peerConnections[id];
218
- RTCIceCandidate candidate = new RTCIceCandidate (
219
- candidateMap['candidate' ],
220
- candidateMap['sdpMid' ],
221
- candidateMap['sdpMLineIndex' ]);
222
- if (pc != null ) {
223
- await pc.addCandidate (candidate);
224
- } else {
225
- _remoteCandidates.add (candidate);
203
+ var id = 'caller' ;
204
+ var candidateMap = message;
205
+ if (candidateMap != null ) {
206
+ var pc = _peerConnections[id];
207
+ RTCIceCandidate candidate = new RTCIceCandidate (
208
+ candidateMap['candidate' ],
209
+ candidateMap['sdpMid' ],
210
+ candidateMap['sdpMLineIndex' ]);
211
+ if (pc != null ) {
212
+ await pc.addCandidate (candidate);
213
+ } else {
214
+ _remoteCandidates.add (candidate);
215
+ }
216
+ }
217
+ }
218
+ break ;
219
+
220
+ case 'peers' :
221
+ {
222
+ Map <String , dynamic > mapData = decoder.convert (message);
223
+ var data = mapData['data' ];
224
+ List <dynamic > peers = data;
225
+ if (this .onPeersUpdate != null ) {
226
+ Map <String , dynamic > event = new Map <String , dynamic >();
227
+ event['self' ] = _selfId;
228
+ event['peers' ] = peers;
229
+ this .onPeersUpdate (event);
226
230
}
227
231
}
228
232
break ;
229
233
case 'leave' :
230
234
{
235
+ Map <String , dynamic > mapData = decoder.convert (message);
236
+ var data = mapData['data' ];
231
237
var id = data;
232
238
var pc = _peerConnections.remove (id);
233
239
_dataChannels.remove (id);
@@ -248,6 +254,8 @@ class Signaling {
248
254
break ;
249
255
case 'bye' :
250
256
{
257
+ Map <String , dynamic > mapData = decoder.convert (message);
258
+ var data = mapData['data' ];
251
259
var to = data['to' ];
252
260
var sessionId = data['session_id' ];
253
261
print ('bye: ' + sessionId);
@@ -286,7 +294,6 @@ class Signaling {
286
294
}
287
295
288
296
void connect () async {
289
- // var url = 'https://$_host:$_port/ws';
290
297
var url = 'http://$_host :$_port ' ;
291
298
_socket = SimpleWebSocket (url);
292
299
@@ -324,10 +331,9 @@ class Signaling {
324
331
});
325
332
};
326
333
327
- _socket.onMessage = (message) {
328
- print ('Recivied data: ' + message);
329
- JsonDecoder decoder = new JsonDecoder ();
330
- this .onMessage (decoder.convert (message));
334
+ _socket.onMessage = (tag, message) {
335
+ print ('Recivied data: $tag - $message ' );
336
+ this .onMessage (tag, message);
331
337
};
332
338
333
339
_socket.onClose = (int code, String reason) {
@@ -346,7 +352,7 @@ class Signaling {
346
352
'video' : {
347
353
'mandatory' : {
348
354
'minWidth' :
349
- '640' , // Provide your own width, height and frame rate here
355
+ '640' , // Provide your own width, height and frame rate here
350
356
'minHeight' : '480' ,
351
357
'minFrameRate' : '30' ,
352
358
},
@@ -369,16 +375,12 @@ class Signaling {
369
375
RTCPeerConnection pc = await createPeerConnection (_iceServers, _config);
370
376
if (media != 'data' ) pc.addStream (_localStream);
371
377
pc.onIceCandidate = (candidate) {
372
- _send ('candidate' , {
373
- 'to' : id,
374
- 'from' : _selfId,
375
- 'candidate' : {
376
- 'sdpMLineIndex' : candidate.sdpMlineIndex,
377
- 'sdpMid' : candidate.sdpMid,
378
- 'candidate' : candidate.candidate,
379
- },
380
- 'session_id' : this ._sessionId,
381
- });
378
+ final iceCandidate = {
379
+ 'sdpMLineIndex' : candidate.sdpMlineIndex,
380
+ 'sdpMid' : candidate.sdpMid,
381
+ 'candidate' : candidate.candidate,
382
+ };
383
+ emitIceCandidateEvent (! (calleeId == null ), iceCandidate);
382
384
};
383
385
384
386
pc.onIceConnectionState = (state) {};
@@ -424,13 +426,9 @@ class Signaling {
424
426
RTCSessionDescription s = await pc
425
427
.createOffer (media == 'data' ? _dc_constraints : _constraints);
426
428
pc.setLocalDescription (s);
427
- _send ('offer' , {
428
- 'to' : id,
429
- 'from' : _selfId,
430
- 'description' : {'sdp' : s.sdp, 'type' : s.type},
431
- 'session_id' : this ._sessionId,
432
- 'media' : media,
433
- });
429
+
430
+ final description = {'sdp' : s.sdp, 'type' : s.type};
431
+ emitOfferEvent (id, description);
434
432
} catch (e) {
435
433
print (e.toString ());
436
434
}
@@ -441,21 +439,27 @@ class Signaling {
441
439
RTCSessionDescription s = await pc
442
440
.createAnswer (media == 'data' ? _dc_constraints : _constraints);
443
441
pc.setLocalDescription (s);
444
- _send ('answer' , {
445
- 'to' : id,
446
- 'from' : _selfId,
447
- 'description' : {'sdp' : s.sdp, 'type' : s.type},
448
- 'session_id' : this ._sessionId,
449
- });
442
+
443
+ final description = {'sdp' : s.sdp, 'type' : s.type};
444
+ emitAnswerEvent (description);
450
445
} catch (e) {
451
446
print (e.toString ());
452
447
}
453
448
}
454
449
455
450
_send (event, data) {
456
- var request = new Map ();
457
- request["type" ] = event;
458
- request["data" ] = data;
459
- _socket.send (_encoder.convert (request));
451
+ _socket.send (event, data);
452
+ }
453
+
454
+ emitOfferEvent (peerId, description) {
455
+ _send (OFFER_EVENT , {'peerId' : peerId, 'description' : description});
456
+ }
457
+
458
+ emitAnswerEvent (description) {
459
+ _send (ANSWER_EVENT , {'description' : description});
460
+ }
461
+
462
+ emitIceCandidateEvent (isHost, candidate) {
463
+ _send (ICE_CANDIDATE_EVENT , {'isHost' : isHost, 'candidate' : candidate});
460
464
}
461
465
}
0 commit comments