159 lines
4.4 KiB
Go
159 lines
4.4 KiB
Go
package localserver
|
|
|
|
import (
|
|
context "context"
|
|
"strconv"
|
|
|
|
"github.com/pion/webrtc/v3"
|
|
)
|
|
|
|
const (
|
|
INCOMING_PEER_FS ReqType = "incoming_peer_fs"
|
|
LEAVING_PEER_FS ReqType = "leaving_peer_fs"
|
|
WEBRTC_OFFER_FS ReqType = "offer_fs"
|
|
WEBRTC_ANSWER_FS ReqType = "answer_fs"
|
|
WEBRTC_RENNEGOTIATION_OFFER_FS ReqType = "rennegotiation_offer_fs"
|
|
WEBRTC_RENNEGOTIATION_ANSWER_FS ReqType = "rennegotiation_answer_fs"
|
|
WEBRTC_COUNTER_OFFER_FS ReqType = "webrtc_counter_offer_fs"
|
|
WEBRTC_CANDIDATE_FS ReqType = "webrtc_candidate_fs"
|
|
)
|
|
|
|
type WebRTCFsMiddleware struct {
|
|
Manager *WebrtcFsManager
|
|
stream GrpcManager_LinkClient
|
|
}
|
|
|
|
func NewWebRTCFsMiddleware(manager *WebrtcFsManager) (webrtcFsMiddleware *WebRTCFsMiddleware) {
|
|
webrtcFsMiddleware = &WebRTCFsMiddleware{
|
|
Manager: manager,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (wfm *WebRTCFsMiddleware) signalCandidate(to string, candidate *webrtc.ICECandidate) (err error) {
|
|
err = wfm.stream.Send(&Request{
|
|
Type: string(WEBRTC_CANDIDATE_FS),
|
|
From: "lolo_local_serv",
|
|
Token: "none",
|
|
Payload: map[string]string{
|
|
"from": "lolo_local_serv",
|
|
"to": to,
|
|
"candidate": candidate.ToJSON().Candidate,
|
|
"sdpMid": *candidate.ToJSON().SDPMid,
|
|
"sdpMlineIndex": strconv.Itoa(int(*candidate.ToJSON().SDPMLineIndex)),
|
|
},
|
|
})
|
|
return
|
|
}
|
|
|
|
func (wfm *WebRTCFsMiddleware) Process(ctx context.Context, req *Response, stream GrpcManager_LinkClient) (err error) {
|
|
done, errCh := make(chan struct{}), make(chan error)
|
|
go func() {
|
|
switch req.Type {
|
|
case string(INCOMING_PEER_FS):
|
|
logger.Println("quit squad called")
|
|
if from, ok := req.Payload[FROM]; ok {
|
|
logger.Println(from)
|
|
//wfm.Manager.HandleLeavingMember(from)
|
|
done <- struct{}{}
|
|
}
|
|
case string(PEER_CONNECTION_REQUEST):
|
|
if err := validateRequest(req.Payload, FROM, TO); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
// if err := wfm.Manager.CreateOffer(ctx, req.Payload[FROM], req.Payload[TO], wfm.signalCandidate); err != nil {
|
|
// errCh <- err
|
|
// return
|
|
// }
|
|
done <- struct{}{}
|
|
case string(WEBRTC_OFFER_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM, TO, SDP); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := wfm.Manager.HandleOffer(ctx, req.GetPayload(), wfm.signalCandidate); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
case string(WEBRTC_ANSWER_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM, TO, SDP); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := wfm.Manager.HandleAnswer(ctx, req.GetPayload()); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
case string(WEBRTC_COUNTER_OFFER_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := wfm.Manager.HandleCounterOffer(ctx, req.Payload); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
case string(WEBRTC_RENNEGOTIATION_ANSWER_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM, SDP); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := wfm.Manager.HandleRennegotiationAnswer(req.Payload[FROM], "lolo_local_serv", req.Payload[SDP]); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
case string(WEBRTC_RENNEGOTIATION_OFFER_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM, SDP); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
if err := wfm.Manager.HandleRennegotiationOffer(req.Payload[FROM], "", req.Payload[SDP]); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
case string(WEBRTC_CANDIDATE_FS):
|
|
if err := validateRequest(req.GetPayload(), FROM, "candidate", "sdpMlineIndex", "sdpMid"); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
logger.Println(req.Payload)
|
|
i, err := strconv.Atoi(req.Payload["sdpMlineIndex"])
|
|
if err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
sdpMlineIndex := uint16(i)
|
|
sdpMid := req.Payload["sdpMid"]
|
|
logger.Println(sdpMid, sdpMlineIndex)
|
|
if err := wfm.Manager.AddCandidate(&webrtc.ICECandidateInit{
|
|
Candidate: req.Payload["candidate"],
|
|
SDPMid: &sdpMid,
|
|
SDPMLineIndex: &sdpMlineIndex,
|
|
}, req.Payload[FROM]); err != nil {
|
|
errCh <- err
|
|
return
|
|
}
|
|
done <- struct{}{}
|
|
default:
|
|
logger.Println("fs is correctly linked")
|
|
done <- struct{}{}
|
|
}
|
|
done <- struct{}{}
|
|
}()
|
|
select {
|
|
case <-ctx.Done():
|
|
err = ctx.Err()
|
|
return
|
|
case <-done:
|
|
return
|
|
case err = <-errCh:
|
|
return
|
|
}
|
|
}
|