Browse Source

Simplify TURN data retrieval API.

Receivers no longer must implement the rather large "Sender" interface and
a complete "Session" object also is no longer required to get TURN data.
pull/415/head
Joachim Bauch 9 years ago
parent
commit
05e266b94c
Failed to extract signature
  1. 3
      go/channelling/api/api_test.go
  2. 2
      go/channelling/api/handle_self.go
  3. 10
      go/channelling/client.go
  4. 4
      go/channelling/hub.go
  5. 7
      go/channelling/pipeline.go
  6. 14
      go/channelling/turndata.go
  7. 21
      go/channelling/turnservice_manager.go

3
go/channelling/api/api_test.go

@ -45,6 +45,9 @@ func (fake *fakeClient) Send(_ buffercache.Buffer) {
func (fake *fakeClient) Outgoing(_ interface{}) { func (fake *fakeClient) Outgoing(_ interface{}) {
} }
func (fake *fakeClient) TurnDataAvailable(_ *channelling.DataTurn) {
}
type fakeRoomManager struct { type fakeRoomManager struct {
joinedRoomID string joinedRoomID string
leftRoomID string leftRoomID string

2
go/channelling/api/handle_self.go

@ -44,7 +44,7 @@ func (api *channellingAPI) HandleSelf(sender channelling.Sender, session *channe
Token: token, Token: token,
Version: api.config.Version, Version: api.config.Version,
ApiVersion: apiVersion, ApiVersion: apiVersion,
Turn: api.TurnDataCreator.CreateTurnData(sender, session), Turn: api.TurnDataCreator.CreateTurnData(session.Id, sender),
Stun: api.config.StunURIs, Stun: api.config.StunURIs,
} }
api.BusManager.Trigger(channelling.BusManagerSession, session.Id, session.Userid(), nil, nil) api.BusManager.Trigger(channelling.BusManagerSession, session.Id, session.Userid(), nil, nil)

10
go/channelling/client.go

@ -28,7 +28,8 @@ import (
) )
type Sender interface { type Sender interface {
Index() uint64 TurnDataReceiver
Send(buffercache.Buffer) Send(buffercache.Buffer)
Outgoing(interface{}) Outgoing(interface{})
} }
@ -106,3 +107,10 @@ func (client *Client) ReplaceAndClose(oldClient *Client) {
oldClient.Close() oldClient.Close()
}() }()
} }
func (client *Client) TurnDataAvailable(turn *DataTurn) {
client.Outgoing(&DataTurnUpdate{
Type: "TurnUpdate",
Turn: turn,
})
}

4
go/channelling/hub.go

@ -91,13 +91,13 @@ func (h *hub) ClientInfo(details bool) (clientCount int, sessions map[string]*Da
return return
} }
func (h *hub) CreateTurnData(sender Sender, session *Session) *DataTurn { func (h *hub) CreateTurnData(sessionId string, receiver TurnDataReceiver) *DataTurn {
if len(h.turnSecret) > 0 { if len(h.turnSecret) > 0 {
// Create turn data credentials for shared secret auth with TURN // Create turn data credentials for shared secret auth with TURN
// server. See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00 // server. See http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
// and https://code.google.com/p/rfc5766-turn-server/ REST API auth // and https://code.google.com/p/rfc5766-turn-server/ REST API auth
// and set shared secret in TURN server with static-auth-secret. // and set shared secret in TURN server with static-auth-secret.
id := session.Id id := sessionId
bar := sha256.New() bar := sha256.New()
bar.Write([]byte(id)) bar.Write([]byte(id))
id = base64.StdEncoding.EncodeToString(bar.Sum(nil)) id = base64.StdEncoding.EncodeToString(bar.Sum(nil))

7
go/channelling/pipeline.go

@ -270,3 +270,10 @@ func (pipeline *Pipeline) attach(sink Sink) error {
pipeline.sink = sink pipeline.sink = sink
return nil return nil
} }
func (pipeline *Pipeline) TurnDataAvailable(turn *DataTurn) {
pipeline.Outgoing(&DataTurnUpdate{
Type: "TurnUpdate",
Turn: turn,
})
}

14
go/channelling/turndata.go

@ -21,6 +21,18 @@
package channelling package channelling
type TurnDataReceiver interface {
Index() uint64
TurnDataAvailable(*DataTurn)
}
type TurnDataCreator interface { type TurnDataCreator interface {
CreateTurnData(Sender, *Session) *DataTurn /*
First parameter is the id of the session that requests the TURN data.
Second parameter will be notified when TURN data become available if none
were ready at the time the method was called (can be nil if no notification
is required).
*/
CreateTurnData(string, TurnDataReceiver) *DataTurn
} }

21
go/channelling/turnservice_manager.go

@ -35,7 +35,7 @@ type TURNServiceManager interface {
type turnServiceManager struct { type turnServiceManager struct {
sync.Mutex sync.Mutex
pleaders map[uint64]Sender // Mapping of clients waiting to receive TURN data. pleaders map[uint64]TurnDataReceiver // Mapping of clients waiting to receive TURN data.
uri string uri string
accessToken string accessToken string
@ -51,7 +51,7 @@ func NewTURNServiceManager(uri string, accessToken string, clientID string) TURN
clientID: clientID, clientID: clientID,
turnService: turnService, turnService: turnService,
pleaders: make(map[uint64]Sender), pleaders: make(map[uint64]TurnDataReceiver),
} }
turnService.Open(accessToken, clientID, "") turnService.Open(accessToken, clientID, "")
@ -71,14 +71,16 @@ func NewTURNServiceManager(uri string, accessToken string, clientID string) TURN
return mgr return mgr
} }
func (mgr *turnServiceManager) CreateTurnData(sender Sender, session *Session) *DataTurn { func (mgr *turnServiceManager) CreateTurnData(sessionId string, receiver TurnDataReceiver) *DataTurn {
credentials := mgr.turnService.Credentials(false) credentials := mgr.turnService.Credentials(false)
turn, err := mgr.turnData(credentials) turn, err := mgr.turnData(credentials)
if err != nil || turn.Ttl == 0 { if err != nil || turn.Ttl == 0 {
// When no data was return from service, refresh quickly. // When no data was return from service, refresh quickly.
mgr.Lock() if receiver != nil {
mgr.pleaders[sender.Index()] = sender mgr.Lock()
mgr.Unlock() mgr.pleaders[receiver.Index()] = receiver
mgr.Unlock()
}
// Have client come back early. // Have client come back early.
turn.Ttl = 300 turn.Ttl = 300
@ -129,12 +131,9 @@ func (mgr *turnServiceManager) onCredentials(credentials *turnservicecli.CachedC
mgr.Lock() mgr.Lock()
for _, sender := range mgr.pleaders { for _, sender := range mgr.pleaders {
if turn, err := mgr.turnData(credentials); err == nil { if turn, err := mgr.turnData(credentials); err == nil {
sender.Outgoing(&DataTurnUpdate{ sender.TurnDataAvailable(turn)
Type: "TurnUpdate",
Turn: turn,
})
} }
} }
mgr.pleaders = make(map[uint64]Sender) // Clear. mgr.pleaders = make(map[uint64]TurnDataReceiver) // Clear.
mgr.Unlock() mgr.Unlock()
} }

Loading…
Cancel
Save