Directly message singaling

This commit is contained in:
2025-10-19 17:34:44 +08:00
parent 4626529eb5
commit 28d60c722a
2 changed files with 19 additions and 7 deletions

View File

@@ -108,10 +108,10 @@ The signaling server broadcasts messages using the WebSocketPacket format. All m
**WebSocketPacket Format:** **WebSocketPacket Format:**
For signaling messages: For signaling messages (see SignalingMessage model):
```json ```json
{ {
"type": "signaling", "type": "webrtc.signal",
"data": { "data": {
"type": "signaling-message-type", "type": "signaling-message-type",
"data": { "data": {
@@ -119,14 +119,14 @@ For signaling messages:
"answer": "...SDP string here...", "answer": "...SDP string here...",
"candidate": {...ICE candidate data...} "candidate": {...ICE candidate data...}
}, },
"to": "optional-target-user-id-for-directed-messaging",
"senderAccountId": "server-validated-user-guid", "senderAccountId": "server-validated-user-guid",
"senderInfo": { "senderInfo": {
// Full SnAccount model with user details
"id": "user-guid", "id": "user-guid",
"name": "username", "name": "username",
"nick": "display nickname", "nick": "display nickname",
"profile": { ... }, "profile": {},
// ... complete account information "updatedAt": "2022-01-01T00:00:00Z"
} }
} }
} }
@@ -137,7 +137,11 @@ For connection established:
{ {
"type": "webrtc", "type": "webrtc",
"data": { "data": {
// welcome data "userId": "user-guid",
"roomId": "room-guid",
"message": "Connected to call...",
"timestamp": "2022-01-01T00:00:00Z",
"participants": [...]
} }
} }
``` ```

View File

@@ -19,6 +19,7 @@ public class SignalingMessage
{ {
public string Type { get; set; } = null!; public string Type { get; set; } = null!;
public object? Data { get; set; } public object? Data { get; set; }
public string? To { get; set; }
public string? AccountId { get; set; } public string? AccountId { get; set; }
public SnAccount? Account { get; set; } public SnAccount? Account { get; set; }
} }
@@ -377,9 +378,16 @@ public class RealtimeCallController(
var messageBytes = packet.ToBytes(); var messageBytes = packet.ToBytes();
var segment = new ArraySegment<byte>(messageBytes); var segment = new ArraySegment<byte>(messageBytes);
var signalingMessage = packet.GetData<SignalingMessage>();
var targetAccountId = signalingMessage?.To;
foreach (var pair in roomDict) foreach (var pair in roomDict)
{ {
if (pair.Key == senderId) continue; // Skip sender unless it's broadcast message
if (!string.IsNullOrEmpty(targetAccountId) && pair.Key == senderId) continue;
// If directed message, only send to target
if (!string.IsNullOrEmpty(targetAccountId) && pair.Value.AccountId != targetAccountId) continue;
if (pair.Value.Socket.State != WebSocketState.Open) continue; if (pair.Value.Socket.State != WebSocketState.Open) continue;
await pair.Value.Socket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None); await pair.Value.Socket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);