Skip to content

Instantly share code, notes, and snippets.

@shinyoshiaki
Created February 14, 2019 08:24
Show Gist options
  • Select an option

  • Save shinyoshiaki/63e389aba1e5110c29c6c7de64ddc3c5 to your computer and use it in GitHub Desktop.

Select an option

Save shinyoshiaki/63e389aba1e5110c29c6c7de64ddc3c5 to your computer and use it in GitHub Desktop.
using Newtonsoft.Json;
using Quobject.SocketIoClientDotNet.Client;
using SimplePeerConnectionM;
using System.Collections.Generic;
namespace WebRTC
{
public class Signaling
{
public delegate void OnData(string s);
public OnData OnDataMethod;
PeerConnectionM peer;
Socket socket = IO.Socket("https://aqueous-earth-75182.herokuapp.com/");
class RoomJson { public string roomId; }
string roomId;
Signaling(string room) { roomId = room; }
void Create()
{
InitPeer();
var data = new RoomJson();
data.roomId = roomId;
var json = new JSONObject(JsonConvert.SerializeObject(data));
socket.Emit("create", json);
socket.On("sdp", SetSdp);
}
void Join()
{
InitPeer();
var data = new RoomJson();
data.roomId = roomId;
var json = new JSONObject(JsonConvert.SerializeObject(data));
socket.Emit("join", json);
socket.On("join", () =>
{
peer.CreateOffer();
});
socket.On("sdp", SetSdp);
}
void InitPeer()
{
List<string> servers = new List<string>();
servers.Add("stun: stun.skyway.io:3478");
servers.Add("stun: stun.l.google.com:19302");
peer = new PeerConnectionM(servers, "", "");
peer.OnLocalSdpReadytoSend += OnLocalSdpReadytoSend;
peer.OnIceCandiateReadytoSend += setIceCandidate;
peer.AddDataChannel();
peer.OnLocalDataChannelReady += Connected;
peer.OnDataFromDataChannelReady += Received;
}
class SdpJson { public string type; public string sdp; }
class IceJson { public string candidate; public int sdpMline; public string sdpMid; }
class SendSdpJson
{
public string sdp;
public string roomId;
}
void OnLocalSdpReadytoSend(int id, string type, string sdp)
{
var sdpData = new SdpJson();
sdpData.sdp = sdp;
sdpData.type = type;
var data = new SendSdpJson();
data.roomId = roomId;
data.sdp = new JSONObject(JsonConvert.SerializeObject(sdpData)).ToString();
var json = new JSONObject(JsonConvert.SerializeObject(data));
socket.Emit(roomId, json);
}
class SendIce
{
public string sdp;
public string roomId;
}
public void setIceCandidate(int id, string candidate, int sdpMlineIndex, string sdpMid)
{
var iceData = new IceJson();
iceData.candidate = candidate;
iceData.sdpMline = sdpMlineIndex;
iceData.sdpMid = sdpMid;
var data = new SendIce();
data.roomId = roomId;
data.sdp = new JSONObject(JsonConvert.SerializeObject(iceData)).ToString();
var json = new JSONObject(JsonConvert.SerializeObject(data));
socket.Emit("ice", json);
}
public void Connected(int id)
{
var data = new RoomJson();
data.roomId = roomId;
roomId = data.roomId;
var json = new JSONObject(JsonConvert.SerializeObject(data));
socket.Emit("connect", json);
}
public void Received(int id, string s)
{
OnDataMethod(s);
}
void SetSdp(object raw)
{
var data = JsonConvert.DeserializeObject<SdpJson>(raw.ToString());
switch (data.type)
{
case "offer":
peer.SetRemoteDescription(data.type, data.sdp);
peer.CreateAnswer();
break;
case "answer":
peer.SetRemoteDescription(data.type, data.sdp);
break;
case "ice":
var ice = JsonConvert.DeserializeObject<IceJson>(data.sdp.ToString());
peer.AddIceCandidate(ice.candidate, ice.sdpMline, ice.sdpMid);
break;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment