Update: Needs Testing - Not Tested
This commit is contained in:
@@ -16,6 +16,14 @@ public static class RtcEndpoints
|
|||||||
app.MapPost("/api/rtc/offer", async (RtcOffer request, RtcCallService rtcCallService) =>
|
app.MapPost("/api/rtc/offer", async (RtcOffer request, RtcCallService rtcCallService) =>
|
||||||
{
|
{
|
||||||
await rtcCallService.WriteOfferAsync(request.ChannelId, request.Username, request.SessionDescription);
|
await rtcCallService.WriteOfferAsync(request.ChannelId, request.Username, request.SessionDescription);
|
||||||
|
|
||||||
|
RtcNotificationService.Broadcast(new RtcNotificationMessage
|
||||||
|
{
|
||||||
|
Type = "rtc_offer_updated",
|
||||||
|
ChannelId = request.ChannelId,
|
||||||
|
Username = request.Username
|
||||||
|
});
|
||||||
|
|
||||||
return Results.Ok();
|
return Results.Ok();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -31,14 +39,6 @@ public static class RtcEndpoints
|
|||||||
return Results.Ok(await rtcCallService.HasActiveCallAsync(channelId));
|
return Results.Ok(await rtcCallService.HasActiveCallAsync(channelId));
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: You can uncomment me if you'd like to have both. Otherwise delete me - you never know but I made it "call" instead of "active"
|
|
||||||
// Return the active call object for the specified channel.
|
|
||||||
//app.MapGet("/api/rtc/call/{channelId}", async (string channelId, RtcCallService rtcCallService) =>
|
|
||||||
//{
|
|
||||||
// var call = await rtcCallService.GetActiveCallAsync(channelId);
|
|
||||||
// return call is null ? Results.NotFound() : Results.Ok(call);
|
|
||||||
//});
|
|
||||||
|
|
||||||
// Return the latest stored SDP offer for the specified channel.
|
// Return the latest stored SDP offer for the specified channel.
|
||||||
app.MapGet("/api/rtc/offers/{channelId}", async (string channelId, RtcCallService rtcCallService) =>
|
app.MapGet("/api/rtc/offers/{channelId}", async (string channelId, RtcCallService rtcCallService) =>
|
||||||
{
|
{
|
||||||
@@ -47,9 +47,22 @@ public static class RtcEndpoints
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Store a new SDP answer for the specified channel call.
|
// Store a new SDP answer for the specified channel call.
|
||||||
app.MapPost("/api/rtc/answer", async (RtcOffer request, RtcCallService rtcCallService) =>
|
app.MapPost("/api/rtc/answer", async (RtcAnswer request, RtcCallService rtcCallService) =>
|
||||||
{
|
{
|
||||||
await rtcCallService.WriteAnswerAsync(request.ChannelId, request.SessionDescription);
|
await rtcCallService.WriteAnswerAsync(
|
||||||
|
request.ChannelId,
|
||||||
|
new RtcSessionDescription
|
||||||
|
{
|
||||||
|
Type = "answer",
|
||||||
|
Sdp = request.Sdp
|
||||||
|
});
|
||||||
|
|
||||||
|
RtcNotificationService.Broadcast(new RtcNotificationMessage
|
||||||
|
{
|
||||||
|
Type = "rtc_answer_updated",
|
||||||
|
ChannelId = request.ChannelId
|
||||||
|
});
|
||||||
|
|
||||||
return Results.Ok();
|
return Results.Ok();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -78,6 +91,14 @@ public static class RtcEndpoints
|
|||||||
request.Direction
|
request.Direction
|
||||||
);
|
);
|
||||||
|
|
||||||
|
RtcNotificationService.Broadcast(new RtcNotificationMessage
|
||||||
|
{
|
||||||
|
Type = "rtc_candidate_added",
|
||||||
|
ChannelId = request.ChannelId,
|
||||||
|
Username = request.Username,
|
||||||
|
Direction = request.Direction
|
||||||
|
});
|
||||||
|
|
||||||
return Results.Ok();
|
return Results.Ok();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -102,6 +123,14 @@ public static class RtcEndpoints
|
|||||||
app.MapPost("/api/rtc/leave", async (RtcLeaveRequest request, RtcCallService rtcCallService) =>
|
app.MapPost("/api/rtc/leave", async (RtcLeaveRequest request, RtcCallService rtcCallService) =>
|
||||||
{
|
{
|
||||||
await rtcCallService.LeaveCallAsync(request.ChannelId, request.Username);
|
await rtcCallService.LeaveCallAsync(request.ChannelId, request.Username);
|
||||||
|
|
||||||
|
RtcNotificationService.Broadcast(new RtcNotificationMessage
|
||||||
|
{
|
||||||
|
Type = "rtc_call_left",
|
||||||
|
ChannelId = request.ChannelId,
|
||||||
|
Username = request.Username
|
||||||
|
});
|
||||||
|
|
||||||
return Results.Ok();
|
return Results.Ok();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
9
RelayServer/Models/Rtc/RtcNotificationMessage.cs
Normal file
9
RelayServer/Models/Rtc/RtcNotificationMessage.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace RelayServer.Models.Rtc;
|
||||||
|
|
||||||
|
public sealed class RtcNotificationMessage
|
||||||
|
{
|
||||||
|
public required string Type { get; set; } // rtc_offer_updated / rtc_answer_updated / rtc_candidate_added
|
||||||
|
public required string ChannelId { get; set; }
|
||||||
|
public string? Username { get; set; }
|
||||||
|
public string? Direction { get; set; }
|
||||||
|
}
|
||||||
@@ -30,8 +30,10 @@ app.MapRtcEndpoints();
|
|||||||
|
|
||||||
var wssv = new WebSocketServer("ws://localhost:1337");
|
var wssv = new WebSocketServer("ws://localhost:1337");
|
||||||
wssv.AddWebSocketService<ChatSocketBehavior>("/");
|
wssv.AddWebSocketService<ChatSocketBehavior>("/");
|
||||||
//TODO: Create WebSocket message system which can alert clients already connected to a channel of changes to offer, answers, and ice candidates
|
RtcNotificationService.Server = wssv;
|
||||||
|
|
||||||
//TODO: Use AnswerCallback as a test on client and use the /rtc/answer endpoint call as a test on server
|
//TODO: Use AnswerCallback as a test on client and use the /rtc/answer endpoint call as a test on server
|
||||||
|
|
||||||
wssv.Start();
|
wssv.Start();
|
||||||
Console.WriteLine("WebSocket server started");
|
Console.WriteLine("WebSocket server started");
|
||||||
|
|
||||||
|
|||||||
19
RelayServer/Services/Rtc/RtcNotificationService.cs
Normal file
19
RelayServer/Services/Rtc/RtcNotificationService.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using RelayServer.Models.Rtc;
|
||||||
|
using WebSocketSharp.Server;
|
||||||
|
|
||||||
|
namespace RelayServer.Services.Rtc;
|
||||||
|
|
||||||
|
public static class RtcNotificationService
|
||||||
|
{
|
||||||
|
public static WebSocketServer? Server { get; set; }
|
||||||
|
|
||||||
|
public static void Broadcast(RtcNotificationMessage message)
|
||||||
|
{
|
||||||
|
if (Server is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var json = JsonSerializer.Serialize(message);
|
||||||
|
Server.WebSocketServices["/"]?.Sessions.Broadcast(json);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user