|
|
|
|
@ -8,7 +8,7 @@ import '../utils/turn.dart' if (dart.library.js) '../utils/turn_web.dart';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum SignalingState { Open, Closed, Error }
|
|
|
|
|
enum CallState { Calling, Ringing, Invite, Connected, Bye }
|
|
|
|
|
enum CallState {Bye}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const JsonEncoder _encoder = JsonEncoder();
|
|
|
|
|
@ -68,7 +68,7 @@ class Signaling {
|
|
|
|
|
Function(SessionOneToOne session, MediaStream stream) onRemoveRemoteStream;
|
|
|
|
|
Function(dynamic event) onPeersUpdate;
|
|
|
|
|
Function(dynamic event) onConnected;
|
|
|
|
|
Function(dynamic event) onRemoteConnected;
|
|
|
|
|
Function(dynamic event) onCallAccepted;
|
|
|
|
|
Function(SessionOneToOne session, RTCDataChannel dc, RTCDataChannelMessage data) onDataChannelMessage;
|
|
|
|
|
Function(SessionOneToOne session, RTCDataChannel dc) onDataChannel;
|
|
|
|
|
|
|
|
|
|
@ -105,7 +105,7 @@ class Signaling {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
close() async {
|
|
|
|
|
await finishSessions();
|
|
|
|
|
finishSessions();
|
|
|
|
|
_socket?.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -139,7 +139,6 @@ class Signaling {
|
|
|
|
|
_createDataChannel(session);
|
|
|
|
|
}
|
|
|
|
|
_createOffer(session, media);
|
|
|
|
|
onCallStateChange?.call(session, CallState.Calling);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void bye(SessionOneToOne session) {
|
|
|
|
|
@ -157,7 +156,7 @@ class Signaling {
|
|
|
|
|
switch (mapData['type']) {
|
|
|
|
|
case 'call_accepted':
|
|
|
|
|
{
|
|
|
|
|
onRemoteConnected?.call(data);
|
|
|
|
|
onCallAccepted?.call(data);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
@ -171,8 +170,6 @@ class Signaling {
|
|
|
|
|
|
|
|
|
|
case 'offer':
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var peerId = data['from'];
|
|
|
|
|
var description = data['description'];
|
|
|
|
|
var media = data['media'];
|
|
|
|
|
|
|
|
|
|
@ -186,12 +183,10 @@ class Signaling {
|
|
|
|
|
});
|
|
|
|
|
session.remoteCandidates.clear();
|
|
|
|
|
}
|
|
|
|
|
onCallStateChange?.call(session, CallState.Calling);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'answer':
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var description = data['description'];
|
|
|
|
|
var sessionId = data['session_id'];
|
|
|
|
|
session.pc?.setRemoteDescription(
|
|
|
|
|
@ -200,8 +195,6 @@ class Signaling {
|
|
|
|
|
break;
|
|
|
|
|
case 'candidate':
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var peerId = data['from'];
|
|
|
|
|
var candidateMap = data['candidate'];
|
|
|
|
|
var sessionId = data['session_id'];
|
|
|
|
|
RTCIceCandidate candidate = RTCIceCandidate(candidateMap['candidate'],
|
|
|
|
|
@ -219,23 +212,14 @@ class Signaling {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'leave':
|
|
|
|
|
{
|
|
|
|
|
var peerId = data as String;
|
|
|
|
|
_closeSessionById(peerId);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'bye':
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var sessionId = data['session_id'];
|
|
|
|
|
print('bye: ' + sessionId);
|
|
|
|
|
if (session != null) {
|
|
|
|
|
if(session.local_user.id != data["from"])
|
|
|
|
|
onCallStateChange?.call(session, CallState.Bye);
|
|
|
|
|
_closeSession(session);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'keepalive':
|
|
|
|
|
{
|
|
|
|
|
print('keepalive response!');
|
|
|
|
|
@ -486,14 +470,7 @@ class Signaling {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> finishSessions() async {
|
|
|
|
|
_closeSessionById(session.id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _closeSessionById(String sessionId) {
|
|
|
|
|
if (session != null && session.id == sessionId) {
|
|
|
|
|
_closeSession(session);
|
|
|
|
|
onCallStateChange?.call(session, CallState.Bye);
|
|
|
|
|
}
|
|
|
|
|
_closeSession(session);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> _closeSession(SessionOneToOne session) async {
|
|
|
|
|
|