Delete upstream connections on ICE failure.
This commit is contained in:
1 parent
92de141b97
commit
5205c0773b
2 files changed
+50
-16
No files matched your search
@@ -281,6 +281,12 @@ func addUpConn(c *client, id string) (*upConnection, error) {
|
|||||||
sendICE(c, id, candidate)
|
sendICE(c, id, candidate)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
pc.OnICEConnectionStateChange(func(state webrtc.ICEConnectionState) {
|
||||||
|
if state == webrtc.ICEConnectionStateFailed {
|
||||||
|
c.action(connectionFailedAction{id: id})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
go rtcpUpSender(c, conn)
|
go rtcpUpSender(c, conn)
|
||||||
|
|
||||||
pc.OnTrack(func(remote *webrtc.Track, receiver *webrtc.RTPReceiver) {
|
pc.OnTrack(func(remote *webrtc.Track, receiver *webrtc.RTPReceiver) {
|
||||||
@@ -445,19 +451,17 @@ func rtcpUpSender(c *client, conn *upConnection) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func delUpConn(c *client, id string) {
|
func delUpConn(c *client, id string) bool {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
if c.up == nil {
|
if c.up == nil {
|
||||||
log.Printf("Deleting unknown connection")
|
return false
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
conn := c.up[id]
|
conn := c.up[id]
|
||||||
if conn == nil {
|
if conn == nil {
|
||||||
log.Printf("Deleting unknown connection")
|
return false
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type clientId struct {
|
type clientId struct {
|
||||||
@@ -483,6 +487,7 @@ func delUpConn(c *client, id string) {
|
|||||||
|
|
||||||
conn.pc.Close()
|
conn.pc.Close()
|
||||||
delete(c.up, id)
|
delete(c.up, id)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDownConn(c *client, id string) *downConnection {
|
func getDownConn(c *client, id string) *downConnection {
|
||||||
@@ -513,6 +518,12 @@ func addDownConn(c *client, id string, remote *upConnection) (*downConnection, e
|
|||||||
log.Printf("Got track on downstream connection")
|
log.Printf("Got track on downstream connection")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
pc.OnICEConnectionStateChange(func(state webrtc.ICEConnectionState) {
|
||||||
|
if state == webrtc.ICEConnectionStateFailed {
|
||||||
|
c.action(connectionFailedAction{id: id})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if c.down == nil {
|
if c.down == nil {
|
||||||
c.down = make(map[string]*downConnection)
|
c.down = make(map[string]*downConnection)
|
||||||
}
|
}
|
||||||
@@ -528,18 +539,16 @@ func addDownConn(c *client, id string, remote *upConnection) (*downConnection, e
|
|||||||
return conn, nil
|
return conn, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func delDownConn(c *client, id string) {
|
func delDownConn(c *client, id string) bool {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
if c.down == nil {
|
if c.down == nil {
|
||||||
log.Printf("Deleting unknown connection")
|
return false
|
||||||
return
|
|
||||||
}
|
}
|
||||||
conn := c.down[id]
|
conn := c.down[id]
|
||||||
if conn == nil {
|
if conn == nil {
|
||||||
log.Printf("Deleting unknown connection")
|
return false
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, track := range conn.tracks {
|
for _, track := range conn.tracks {
|
||||||
@@ -551,6 +560,7 @@ func delDownConn(c *client, id string) {
|
|||||||
}
|
}
|
||||||
conn.pc.Close()
|
conn.pc.Close()
|
||||||
delete(c.down, id)
|
delete(c.down, id)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func addDownTrack(c *client, id string, remoteTrack *upTrack, remoteConn *upConnection) (*downConnection, *webrtc.RTPSender, error) {
|
func addDownTrack(c *client, id string, remoteTrack *upTrack, remoteConn *upConnection) (*downConnection, *webrtc.RTPSender, error) {
|
||||||
@@ -956,11 +966,13 @@ func clientLoop(c *client, conn *websocket.Conn) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case delConnAction:
|
case delConnAction:
|
||||||
c.write(clientMessage{
|
found := delDownConn(c, a.id)
|
||||||
Type: "close",
|
if found {
|
||||||
Id: a.id,
|
c.write(clientMessage{
|
||||||
})
|
Type: "close",
|
||||||
delDownConn(c, a.id)
|
Id: a.id,
|
||||||
|
})
|
||||||
|
}
|
||||||
case addLabelAction:
|
case addLabelAction:
|
||||||
c.write(clientMessage{
|
c.write(clientMessage{
|
||||||
Type: "label",
|
Type: "label",
|
||||||
@@ -983,6 +995,21 @@ func clientLoop(c *client, conn *websocket.Conn) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case connectionFailedAction:
|
||||||
|
found := delUpConn(c, a.id)
|
||||||
|
if found {
|
||||||
|
c.write(clientMessage{
|
||||||
|
Type: "error",
|
||||||
|
Value: "connection failed",
|
||||||
|
})
|
||||||
|
c.write(clientMessage{
|
||||||
|
Type: "abort",
|
||||||
|
Id: a.id,
|
||||||
|
})
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// What should we do if a downstream
|
||||||
|
// connection fails? Renegotiate?
|
||||||
case permissionsChangedAction:
|
case permissionsChangedAction:
|
||||||
c.write(clientMessage{
|
c.write(clientMessage{
|
||||||
Type: "permissions",
|
Type: "permissions",
|
||||||
@@ -1048,7 +1075,10 @@ func handleClientMessage(c *client, m clientMessage) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case "close":
|
case "close":
|
||||||
delUpConn(c, m.Id)
|
found := delUpConn(c, m.Id)
|
||||||
|
if !found {
|
||||||
|
log.Printf("Deleting unknown up connection %v", m.Id)
|
||||||
|
}
|
||||||
case "ice":
|
case "ice":
|
||||||
if m.Candidate == nil {
|
if m.Candidate == nil {
|
||||||
return protocolError("null candidate")
|
return protocolError("null candidate")
|
||||||
|
|||||||
Reference in new issue
Block a user