handleMessage method
Implementation
@override
Future<void> handleMessage(SignalingMessage message) async {
final payload = message.payload['payload'];
switch (message.type) {
case SignalingMessageType.offer:
if (isOfferer ||
pc != null &&
(await pc!.getSignalingState()) != SignalingState.stable) {
print("Ignoring redundant offer or offer during active negotiation.");
return;
}
if (pc == null) await initialize();
await pc!.setRemoteDescription(
SessionDescription(sdp: payload['sdp'], type: SdpType.offer),
);
hasRemoteDescription = true;
// Process pending candidates
for (var cand in _pendingCandidates) {
await pc!.addIceCandidate(
IceCandidate(
candidate: cand['candidate'],
sdpMid: cand['sdpMid'],
sdpMLineIndex: cand['sdpMLineIndex'],
),
);
}
_pendingCandidates.clear();
final answer = await pc!.createAnswer();
await pc!.setLocalDescription(answer);
sendSignal(SignalingMessageType.answer, {
'sdp': answer.sdp,
'type': answer.type.name,
});
break;
case SignalingMessageType.answer:
await pc!.setRemoteDescription(
SessionDescription(sdp: payload['sdp'], type: SdpType.answer),
);
hasRemoteDescription = true;
// Process pending candidates
for (var cand in _pendingCandidates) {
await pc!.addIceCandidate(
IceCandidate(
candidate: cand['candidate'],
sdpMid: cand['sdpMid'],
sdpMLineIndex: cand['sdpMLineIndex'],
),
);
}
_pendingCandidates.clear();
break;
case SignalingMessageType.candidate:
if (!hasRemoteDescription || pc == null) {
_pendingCandidates.add(payload);
} else {
await pc!.addIceCandidate(
IceCandidate(
candidate: payload['candidate'],
sdpMid: payload['sdpMid'],
sdpMLineIndex: payload['sdpMLineIndex'],
),
);
}
break;
default:
break;
}
}