1
Fork 0
mirror of https://github.com/jech/galene.git synced 2024-11-22 16:45:58 +01:00

Carry raw SDP in the protocol.

This commit is contained in:
Juliusz Chroboczek 2021-01-03 17:00:58 +01:00
parent ddafca5780
commit e393819eda
2 changed files with 51 additions and 47 deletions

View file

@ -162,24 +162,23 @@ func (v rateMap) MarshalJSON() ([]byte, error) {
} }
type clientMessage struct { type clientMessage struct {
Type string `json:"type"` Type string `json:"type"`
Kind string `json:"kind,omitempty"` Kind string `json:"kind,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Source string `json:"source,omitempty"` Source string `json:"source,omitempty"`
Dest string `json:"dest,omitempty"` Dest string `json:"dest,omitempty"`
Username string `json:"username,omitempty"` Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
Privileged bool `json:"privileged,omitempty"` Privileged bool `json:"privileged,omitempty"`
Permissions *group.ClientPermissions `json:"permissions,omitempty"` Permissions *group.ClientPermissions `json:"permissions,omitempty"`
Group string `json:"group,omitempty"` Group string `json:"group,omitempty"`
Value interface{} `json:"value,omitempty"` Value interface{} `json:"value,omitempty"`
Time int64 `json:"time,omitempty"` Time int64 `json:"time,omitempty"`
Offer *webrtc.SessionDescription `json:"offer,omitempty"` SDP string `json:"sdp,omitempty"`
Answer *webrtc.SessionDescription `json:"answer,omitempty"` Candidate *webrtc.ICECandidateInit `json:"candidate,omitempty"`
Candidate *webrtc.ICECandidateInit `json:"candidate,omitempty"` Labels map[string]string `json:"labels,omitempty"`
Labels map[string]string `json:"labels,omitempty"` Request rateMap `json:"request,omitempty"`
Request rateMap `json:"request,omitempty"` RTCConfiguration *webrtc.Configuration `json:"rtcConfiguration,omitempty"`
RTCConfiguration *webrtc.Configuration `json:"rtcConfiguration,omitempty"`
} }
type closeMessage struct { type closeMessage struct {
@ -464,7 +463,7 @@ func negotiate(c *webClient, down *rtpDownConnection, renegotiate, restartIce bo
Id: down.id, Id: down.id,
Source: source, Source: source,
Username: username, Username: username,
Offer: &offer, SDP: offer.SDP,
Labels: labels, Labels: labels,
}) })
} }
@ -481,7 +480,7 @@ func sendICE(c *webClient, id string, candidate *webrtc.ICECandidate) error {
}) })
} }
func gotOffer(c *webClient, id string, offer webrtc.SessionDescription, renegotiate bool, labels map[string]string) error { func gotOffer(c *webClient, id string, sdp string, renegotiate bool, labels map[string]string) error {
if !renegotiate { if !renegotiate {
// unless the client indicates that this is a compatible // unless the client indicates that this is a compatible
// renegotiation, tear down the existing connection. // renegotiation, tear down the existing connection.
@ -496,12 +495,15 @@ func gotOffer(c *webClient, id string, offer webrtc.SessionDescription, renegoti
up.userId = c.Id() up.userId = c.Id()
up.username = c.Username() up.username = c.Username()
err = up.pc.SetRemoteDescription(offer) err = up.pc.SetRemoteDescription(webrtc.SessionDescription{
Type: webrtc.SDPTypeOffer,
SDP: sdp,
})
if err != nil { if err != nil {
if renegotiate && !isnew { if renegotiate && !isnew {
// create a new PC from scratch // create a new PC from scratch
log.Printf("SetRemoteDescription(offer): %v", err) log.Printf("SetRemoteDescription(offer): %v", err)
return gotOffer(c, id, offer, false, labels) return gotOffer(c, id, sdp, false, labels)
} }
return err return err
} }
@ -522,20 +524,23 @@ func gotOffer(c *webClient, id string, offer webrtc.SessionDescription, renegoti
} }
return c.write(clientMessage{ return c.write(clientMessage{
Type: "answer", Type: "answer",
Id: id, Id: id,
Answer: &answer, SDP: answer.SDP,
}) })
} }
var ErrUnknownId = errors.New("unknown id") var ErrUnknownId = errors.New("unknown id")
func gotAnswer(c *webClient, id string, answer webrtc.SessionDescription) error { func gotAnswer(c *webClient, id string, sdp string) error {
down := getDownConn(c, id) down := getDownConn(c, id)
if down == nil { if down == nil {
return ErrUnknownId return ErrUnknownId
} }
err := down.pc.SetRemoteDescription(answer) err := down.pc.SetRemoteDescription(webrtc.SessionDescription{
Type: webrtc.SDPTypeAnswer,
SDP: sdp,
})
if err != nil { if err != nil {
return err return err
} }
@ -1128,21 +1133,15 @@ func handleClientMessage(c *webClient, m clientMessage) error {
}) })
return c.error(group.UserError("not authorised")) return c.error(group.UserError("not authorised"))
} }
if m.Offer == nil {
return group.ProtocolError("null offer")
}
err := gotOffer( err := gotOffer(
c, m.Id, *m.Offer, m.Kind == "renegotiate", m.Labels, c, m.Id, m.SDP, m.Kind == "renegotiate", m.Labels,
) )
if err != nil { if err != nil {
log.Printf("gotOffer: %v", err) log.Printf("gotOffer: %v", err)
return failUpConnection(c, m.Id, "negotiation failed") return failUpConnection(c, m.Id, "negotiation failed")
} }
case "answer": case "answer":
if m.Answer == nil { err := gotAnswer(c, m.Id, m.SDP)
return group.ProtocolError("null answer")
}
err := gotAnswer(c, m.Id, *m.Answer)
if err != nil { if err != nil {
log.Printf("gotAnswer: %v", err) log.Printf("gotAnswer: %v", err)
message := "" message := ""

View file

@ -183,8 +183,7 @@ function ServerConnection() {
* @property {Object<string,boolean>} [permissions] * @property {Object<string,boolean>} [permissions]
* @property {string} [group] * @property {string} [group]
* @property {unknown} [value] * @property {unknown} [value]
* @property {RTCSessionDescriptionInit} [offer] * @property {string} [sdp]
* @property {RTCSessionDescriptionInit} [answer]
* @property {RTCIceCandidate} [candidate] * @property {RTCIceCandidate} [candidate]
* @property {Object<string,string>} [labels] * @property {Object<string,string>} [labels]
* @property {Object<string,(boolean|number)>} [request] * @property {Object<string,(boolean|number)>} [request]
@ -265,10 +264,10 @@ ServerConnection.prototype.connect = async function(url) {
break; break;
case 'offer': case 'offer':
sc.gotOffer(m.id, m.labels, m.source, m.username, sc.gotOffer(m.id, m.labels, m.source, m.username,
m.offer, m.kind === 'renegotiate'); m.sdp, m.kind === 'renegotiate');
break; break;
case 'answer': case 'answer':
sc.gotAnswer(m.id, m.answer); sc.gotAnswer(m.id, m.sdp);
break; break;
case 'renegotiate': case 'renegotiate':
sc.gotRenegotiate(m.id) sc.gotRenegotiate(m.id)
@ -525,11 +524,11 @@ ServerConnection.prototype.groupAction = function(kind, message) {
* @param {Object<string, string>} labels * @param {Object<string, string>} labels
* @param {string} source * @param {string} source
* @param {string} username * @param {string} username
* @param {RTCSessionDescriptionInit} offer * @param {string} sdp
* @param {boolean} renegotiate * @param {boolean} renegotiate
* @function * @function
*/ */
ServerConnection.prototype.gotOffer = async function(id, labels, source, username, offer, renegotiate) { ServerConnection.prototype.gotOffer = async function(id, labels, source, username, sdp, renegotiate) {
let sc = this; let sc = this;
let c = sc.down[id]; let c = sc.down[id];
if(c && !renegotiate) { if(c && !renegotiate) {
@ -598,7 +597,10 @@ ServerConnection.prototype.gotOffer = async function(id, labels, source, usernam
sc.ondownstream.call(sc, c); sc.ondownstream.call(sc, c);
try { try {
await c.pc.setRemoteDescription(offer); await c.pc.setRemoteDescription({
type: 'offer',
sdp: sdp,
});
await c.flushRemoteIceCandidates(); await c.flushRemoteIceCandidates();
@ -609,7 +611,7 @@ ServerConnection.prototype.gotOffer = async function(id, labels, source, usernam
this.send({ this.send({
type: 'answer', type: 'answer',
id: id, id: id,
answer: answer, sdp: answer.sdp,
}); });
} catch(e) { } catch(e) {
try { try {
@ -631,15 +633,18 @@ ServerConnection.prototype.gotOffer = async function(id, labels, source, usernam
* Called when we receive an answer from the server. Don't call this. * Called when we receive an answer from the server. Don't call this.
* *
* @param {string} id * @param {string} id
* @param {RTCSessionDescriptionInit} answer * @param {string} sdp
* @function * @function
*/ */
ServerConnection.prototype.gotAnswer = async function(id, answer) { ServerConnection.prototype.gotAnswer = async function(id, sdp) {
let c = this.up[id]; let c = this.up[id];
if(!c) if(!c)
throw new Error('unknown up stream'); throw new Error('unknown up stream');
try { try {
await c.pc.setRemoteDescription(answer); await c.pc.setRemoteDescription({
type: 'answer',
sdp: sdp,
});
} catch(e) { } catch(e) {
try { try {
if(c.onerror) if(c.onerror)
@ -1038,7 +1043,7 @@ Stream.prototype.negotiate = async function (restartIce) {
kind: this.localDescriptionSent ? 'renegotiate' : '', kind: this.localDescriptionSent ? 'renegotiate' : '',
id: c.id, id: c.id,
labels: c.labelsByMid, labels: c.labelsByMid,
offer: offer, sdp: offer.sdp,
}); });
this.localDescriptionSent = true; this.localDescriptionSent = true;
c.flushLocalIceCandidates(); c.flushLocalIceCandidates();