diff --git a/RelayClient/MainPage.xaml.cs b/RelayClient/MainPage.xaml.cs index 439c259..546f9e6 100644 --- a/RelayClient/MainPage.xaml.cs +++ b/RelayClient/MainPage.xaml.cs @@ -479,8 +479,21 @@ public partial class MainPage : ContentPage public async void WriteIceCandidate(string json) { - IceCandidate? candidate = JsonSerializer.Deserialize(json); - await ServerAPI.PostIceCandidateAsync(candidate); + try + { + IceCandidate? candidate = JsonSerializer.Deserialize(json); + DBIceCandidate DBCandidate = new DBIceCandidate + { + ChannelId = _currentChannelId, + Username = _username, + Candidate = candidate + }; + await ServerAPI.PostIceCandidateAsync(DBCandidate); + } + catch (Exception ex) + { + SafeSendRawToWebView("WriteIceCandidate failed: " + ex.Message); + } } public async void IceCandidateCallback(string json) diff --git a/RelayClient/Resources/Raw/wwwroot/index.js b/RelayClient/Resources/Raw/wwwroot/index.js index 3d6d560..df3cb5c 100644 --- a/RelayClient/Resources/Raw/wwwroot/index.js +++ b/RelayClient/Resources/Raw/wwwroot/index.js @@ -24,7 +24,7 @@ window.setChannelId = function(channelId) { currentChannelId = channelId; LogMessage("Channel set to: " + currentChannelId); }; - +let userMedia = getUserMedia() function LogMessage(msg) { const messageLog = document.getElementById("messageLog"); messageLog.value += '\r\n' + msg; @@ -212,9 +212,10 @@ async function ensurePeerConnection2() console.log(`ICE connection state change: ${peerConnection.iceConnectionState}`); }; - peerConnection.onicecandidate = (event) => { + peerConnection.onicecandidate = async (event) => { console.log(`Ice Candidate: ${JSON.stringify(event.candidate)}`); LogMessage(`Ice Candidate: ${JSON.stringify(event.candidate)}`); + await window.HybridWebView.InvokeDotNet("WriteIceCandidate", [JSON.stringify(event.candidate)]); }; peerConnection.ontrack = (event) => { diff --git a/RelayClient/ServerAPI.cs b/RelayClient/ServerAPI.cs index 75361eb..41bd167 100644 --- a/RelayClient/ServerAPI.cs +++ b/RelayClient/ServerAPI.cs @@ -71,7 +71,7 @@ public class ServerAPI return response.Headers.Location; } - public static async Task PostIceCandidateAsync(IceCandidate candidate) + public static async Task PostIceCandidateAsync(DBIceCandidate candidate) { HttpResponseMessage response = await client.PostAsJsonAsync("api/rtc/candidate", candidate); response.EnsureSuccessStatusCode(); @@ -127,8 +127,18 @@ public class DBOffer } public class IceCandidate { - public string type { get; set; } - public string sdp { get; set; } + public required string candidate { get; set; } + public required string sdpMid { get; set; } + public required int sdpMLineIndex { get; set; } + public required string usernameFragment { get; set; } + +} + +public class DBIceCandidate +{ + public required string ChannelId { get; set; } + public required string Username { get; set; } + public required IceCandidate Candidate { get; set; } } public class RtcLeave diff --git a/RelayServer/Endpoints/RtcEndpoints.cs b/RelayServer/Endpoints/RtcEndpoints.cs index 7bfbde8..8eef93d 100644 --- a/RelayServer/Endpoints/RtcEndpoints.cs +++ b/RelayServer/Endpoints/RtcEndpoints.cs @@ -78,15 +78,15 @@ public static class RtcEndpoints }); // Store a new ICE candidate for the specified channel call. - app.MapPost("/api/rtc/candidate", async (RtcIceCandidate request, RtcCallService rtcCallService) => + app.MapPost("/api/rtc/candidate", async (DBIceCandidate request, RtcCallService rtcCallService) => { await rtcCallService.WriteIceCandidateAsync( request.ChannelId, request.Username, - request.Candidate, - request.SdpMid, - request.SdpMLineIndex, - request.Direction + request.Candidate.candidate, + request.Candidate.sdpMid, + request.Candidate.sdpMLineIndex + // request.Candidate.direction ); RtcNotificationService.BroadcastToChannel(new RtcNotificationMessage @@ -94,7 +94,7 @@ public static class RtcEndpoints Type = "rtc_candidate_added", ChannelId = request.ChannelId, Username = request.Username, - Direction = request.Direction + /*Direction = request.Direction*/ }); return Results.Ok(); diff --git a/RelayServer/Models/Rtc/RtcIceCandidate.cs b/RelayServer/Models/Rtc/RtcIceCandidate.cs index 811376e..82e3efd 100644 --- a/RelayServer/Models/Rtc/RtcIceCandidate.cs +++ b/RelayServer/Models/Rtc/RtcIceCandidate.cs @@ -9,6 +9,22 @@ public class RtcIceCandidate : Record public required string Candidate { get; set; } public string? SdpMid { get; set; } public int? SdpMLineIndex { get; set; } - public required string Direction { get; set; } // "offer" or "answer" + // public required string Direction { get; set; } // "offer" or "answer" public DateTime CreatedAt { get; set; } +} + +public class DBIceCandidate +{ + public required string ChannelId { get; set; } + public required string Username { get; set; } + public required IceCandidate Candidate { get; set; } +} + +public class IceCandidate +{ + public required string candidate { get; set; } + public required string sdpMid { get; set; } + public required int sdpMLineIndex { get; set; } + public required string usernameFragment { get; set; } + } \ No newline at end of file diff --git a/RelayServer/Services/Rtc/RtcCallService.cs b/RelayServer/Services/Rtc/RtcCallService.cs index f92330b..c700323 100644 --- a/RelayServer/Services/Rtc/RtcCallService.cs +++ b/RelayServer/Services/Rtc/RtcCallService.cs @@ -163,8 +163,8 @@ public sealed class RtcCallService string username, string candidate, string? sdpMid, - int? sdpMLineIndex, - string direction) + int? sdpMLineIndex/*, + string direction*/) { await _db.Create("rtc_ice_candidates", new RtcIceCandidate { @@ -173,7 +173,7 @@ public sealed class RtcCallService Candidate = candidate, SdpMid = sdpMid, SdpMLineIndex = sdpMLineIndex, - Direction = direction, + // Direction = direction, CreatedAt = DateTime.UtcNow }); } @@ -208,7 +208,7 @@ public sealed class RtcCallService { var candidates = await _db.Select("rtc_ice_candidates"); return candidates - .Where(x => x.ChannelId == channelId && x.Username != username && x.Direction == direction) + .Where(x => x.ChannelId == channelId && x.Username != username /*&& x.Direction == direction*/) .OrderBy(x => x.CreatedAt) .ToList(); }