Add support for sending data channel messages to a single participant

This is not possible when Janus is used, as Janus only allows
broadcasting data channel messages to all the subscribers of the
publisher connection.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
Daniel Calviño Sánchez 2024-12-05 03:40:11 +01:00 committed by Marcel Hibbe
parent fe32bc1628
commit ea4bccdaf7
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
3 changed files with 49 additions and 0 deletions

View File

@ -13,6 +13,9 @@ import java.util.List;
/**
* Helper class to send messages to participants in a call when an MCU is used.
* <p>
* Note that when Janus is used it is not possible to send a data channel message to a specific participant. Any data
* channel message will be broadcast to all the subscribers of the publisher peer connection (the own peer connection).
*/
public class MessageSenderMcu extends MessageSender {

View File

@ -20,6 +20,19 @@ public class MessageSenderNoMcu extends MessageSender {
super(peerConnectionWrappers);
}
/**
* Sends the given data channel message to the given signaling session ID.
*
* @param dataChannelMessage the message to send
* @param sessionId the signaling session ID of the participant to send the message to
*/
public void send(DataChannelMessage dataChannelMessage, String sessionId) {
PeerConnectionWrapper peerConnectionWrapper = getPeerConnectionWrapper(sessionId);
if (peerConnectionWrapper != null) {
peerConnectionWrapper.send(dataChannelMessage);
}
}
public void sendToAll(DataChannelMessage dataChannelMessage) {
for (PeerConnectionWrapper peerConnectionWrapper: peerConnectionWrappers) {
if ("video".equals(peerConnectionWrapper.getVideoStreamType())){

View File

@ -50,6 +50,39 @@ class MessageSenderNoMcuTest {
messageSender = MessageSenderNoMcu(peerConnectionWrappers)
}
@Test
fun testSendDataChannelMessage() {
val message = DataChannelMessage()
messageSender!!.send(message, "theSessionId2")
Mockito.verify(peerConnectionWrapper2!!).send(message)
Mockito.verify(peerConnectionWrapper1!!, never()).send(message)
Mockito.verify(peerConnectionWrapper2Screen!!, never()).send(message)
Mockito.verify(peerConnectionWrapper4Screen!!, never()).send(message)
}
@Test
fun testSendDataChannelMessageIfScreenPeerConnection() {
val message = DataChannelMessage()
messageSender!!.send(message, "theSessionId4")
Mockito.verify(peerConnectionWrapper1!!, never()).send(message)
Mockito.verify(peerConnectionWrapper2!!, never()).send(message)
Mockito.verify(peerConnectionWrapper2Screen!!, never()).send(message)
Mockito.verify(peerConnectionWrapper4Screen!!, never()).send(message)
}
@Test
fun testSendDataChannelMessageIfNoPeerConnection() {
val message = DataChannelMessage()
messageSender!!.send(message, "theSessionId3")
Mockito.verify(peerConnectionWrapper1!!, never()).send(message)
Mockito.verify(peerConnectionWrapper2!!, never()).send(message)
Mockito.verify(peerConnectionWrapper2Screen!!, never()).send(message)
Mockito.verify(peerConnectionWrapper4Screen!!, never()).send(message)
}
@Test
fun testSendDataChannelMessageToAll() {
val message = DataChannelMessage()