Skip to content

Commit 5427931

Browse files
committed
Optimize signaling.
1 parent 47e9155 commit 5427931

File tree

3 files changed

+58
-53
lines changed

3 files changed

+58
-53
lines changed

lib/src/call_sample/random_string.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,17 @@ const UPPER_ALPHA_END = 90;
3232

3333
/// Generates a random integer where [from] <= [to].
3434
int randomBetween(int from, int to) {
35-
if (from > to) throw new Exception('$from cannot be > $to');
36-
var rand = new Random();
35+
if (from > to) throw Exception('$from cannot be > $to');
36+
var rand = Random();
3737
return ((to - from) * rand.nextDouble()).toInt() + from;
3838
}
3939

4040
/// Generates a random string of [length] with characters
4141
/// between ascii [from] to [to].
4242
/// Defaults to characters of ascii '!' to '~'.
4343
String randomString(int length, {int from: ASCII_START, int to: ASCII_END}) {
44-
return new String.fromCharCodes(
45-
new List.generate(length, (index) => randomBetween(from, to)));
44+
return String.fromCharCodes(
45+
List.generate(length, (index) => randomBetween(from, to)));
4646
}
4747

4848
/// Generates a random string of [length] with only numeric characters.
@@ -71,7 +71,7 @@ String randomAlphaNumeric(int length) {
7171
7272
/// Merge [a] with [b] and scramble characters.
7373
String randomMerge(String a, String b) {
74-
var mergedCodeUnits = new List.from("$a$b".codeUnits);
74+
var mergedCodeUnits = List.from("$a$b".codeUnits);
7575
mergedCodeUnits.shuffle();
76-
return new String.fromCharCodes(mergedCodeUnits);
76+
return String.fromCharCodes(mergedCodeUnits);
7777
}*/

lib/src/call_sample/settings.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class CallSettings extends StatefulWidget {
55
static String tag = 'call_settings';
66

77
@override
8-
_CallSettingsState createState() => new _CallSettingsState();
8+
_CallSettingsState createState() => _CallSettingsState();
99
}
1010

1111
class _CallSettingsState extends State<CallSettings> {
@@ -17,7 +17,6 @@ class _CallSettingsState extends State<CallSettings> {
1717
@override
1818
deactivate() {
1919
super.deactivate();
20-
2120
}
2221

2322
@override
@@ -28,9 +27,7 @@ class _CallSettingsState extends State<CallSettings> {
2827
),
2928
body: OrientationBuilder(
3029
builder: (context, orientation) {
31-
return Center(
32-
child: Text("settings")
33-
);
30+
return Center(child: Text("settings"));
3431
},
3532
),
3633
);

lib/src/call_sample/signaling.dart

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,16 @@ class Session {
4545
}
4646

4747
class 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

Comments
 (0)