// Send RTC message to client private static async Task SendMessage(RTCMessage msg, WebSocket socket) { string jsonMsg = JsonConvert.SerializeObject(msg); var textBuffer = new ArraySegment <byte>(Encoding.UTF8.GetBytes(jsonMsg)); var ct = CancellationToken.None; await socket.SendAsync(textBuffer, WebSocketMessageType.Text, true, ct); }
public async Task SendVideoOffer(RTCMessage message) { try { message.Sender = Context.ConnectionId; await Clients.Client(message.Target).receiveVideoOffer(message); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
// Disconnected clients watcher and notifier private async static Task WatchDisconnectedClients() { while (true) { // Notify other clients var disconnectNotify = new RTCMessage(MessageDisconnected) { Target = disconnectedIds.Take() }; foreach (var clientCtx in clients.Values) { await SendMessage(disconnectNotify, clientCtx.Socket); } } }
// Process incoming message private async Task ProcessMessage(RTCMessage msg, RTCClientContext client) { string[] allowedTypes = { MessageInit, MessageOffer, MessageAnswer, MessageIce }; if (allowedTypes.Contains(msg.Type)) { switch (msg.Type) { case MessageInit: // Another client is ready client.IsReady = true; var readyMsg = new RTCMessage(MessageAvailableClients) { Data = clients.Where(kv => kv.Value != client && kv.Value.IsReady) .Select(kv => kv.Key) .ToArray(), Target = clients.Single(kv => kv.Value == client).Key }; await SendMessage(readyMsg, client.Socket); break; default: // Transfer to paired client var anotherPeer = clients[msg.Target]; // Relay message msg.Target = clients.Single(kv => kv.Value == client).Key; await SendMessage(msg, anotherPeer.Socket); break; } } }
public async Task SendNewIceCandidate(RTCMessage message) { message.Sender = Context.ConnectionId; await Clients.Client(message.Target).SendAsync("ReceiveNewIceCAndidate", message); }
public async Task SendVideoAnswer(RTCMessage message) { message.Sender = Context.ConnectionId; await Clients.Client(message.Target).SendAsync("ReceiveVideoAnswer", message); }