Zippytal-Node/webrtcFsMiddleware.go
2022-08-28 22:17:30 +02:00

168 lines
4.5 KiB
Go

package localserver
import (
context "context"
"encoding/json"
"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 SignalingService_LinkClient
}
func NewWebRTCFsMiddleware(manager *WebrtcFsManager) (webrtcFsMiddleware *WebRTCFsMiddleware) {
webrtcFsMiddleware = &WebRTCFsMiddleware{
Manager: manager,
}
return
}
func (wfm *WebRTCFsMiddleware) signalCandidate(to string, candidate *webrtc.ICECandidate) (err error) {
bs, err := json.Marshal(map[string]string{
"from": "lolo_local_serv",
"to": to,
"candidate": candidate.ToJSON().Candidate,
"sdpMid": *candidate.ToJSON().SDPMid,
"sdpMLineIndex": strconv.Itoa(int(*candidate.ToJSON().SDPMLineIndex)),
})
if err != nil {
return
}
err = wfm.stream.Send(&SignalingMessage{
Type: string(WEBRTC_CANDIDATE_FS),
From: "lolo_local_serv",
Payload: bs,
})
return
}
func (wfm *WebRTCFsMiddleware) Process(ctx context.Context, req *SignalingMessage, stream SignalingService_LinkClient) (err error) {
done, errCh := make(chan struct{}), make(chan error)
go func() {
var payload map[string]string
if e := json.Unmarshal(req.Payload, &payload); err != nil {
errCh <- e
return
}
switch req.Type {
case string(INCOMING_PEER_FS):
logger.Println("quit squad called")
if from, ok := payload[FROM]; ok {
logger.Println(from)
//wfm.Manager.HandleLeavingMember(from)
done <- struct{}{}
}
case string(PEER_CONNECTION_REQUEST):
if err := validateRequest(payload, FROM, TO); err != nil {
errCh <- err
return
}
// if err := wfm.Manager.CreateOffer(ctx, payload[FROM], payload[TO], wfm.signalCandidate); err != nil {
// errCh <- err
// return
// }
done <- struct{}{}
case string(WEBRTC_OFFER_FS):
if err := validateRequest(payload, FROM, TO, SDP); err != nil {
errCh <- err
return
}
if err := wfm.Manager.HandleOffer(ctx, payload, wfm.signalCandidate); err != nil {
errCh <- err
return
}
done <- struct{}{}
case string(WEBRTC_ANSWER_FS):
if err := validateRequest(payload, FROM, TO, SDP); err != nil {
errCh <- err
return
}
if err := wfm.Manager.HandleAnswer(ctx, payload); err != nil {
errCh <- err
return
}
done <- struct{}{}
case string(WEBRTC_COUNTER_OFFER_FS):
if err := validateRequest(payload, FROM); err != nil {
errCh <- err
return
}
if err := wfm.Manager.HandleCounterOffer(ctx, payload); err != nil {
errCh <- err
return
}
done <- struct{}{}
case string(WEBRTC_RENNEGOTIATION_ANSWER_FS):
if err := validateRequest(payload, FROM, SDP); err != nil {
errCh <- err
return
}
if err := wfm.Manager.HandleRennegotiationAnswer(payload[FROM], "lolo_local_serv", payload[SDP]); err != nil {
errCh <- err
return
}
done <- struct{}{}
case string(WEBRTC_RENNEGOTIATION_OFFER_FS):
if err := validateRequest(payload, FROM, SDP); err != nil {
errCh <- err
return
}
if err := wfm.Manager.HandleRennegotiationOffer(payload[FROM], "", payload[SDP]); err != nil {
errCh <- err
return
}
done <- struct{}{}
case string(WEBRTC_CANDIDATE_FS):
if err := validateRequest(payload, FROM, "candidate", "sdpMLineIndex", "sdpMid"); err != nil {
errCh <- err
return
}
logger.Println(payload)
i, err := strconv.Atoi(payload["sdpMLineIndex"])
if err != nil {
errCh <- err
return
}
SDPMLineIndex := uint16(i)
sdpMid := payload["sdpMid"]
logger.Println(sdpMid, SDPMLineIndex)
if err := wfm.Manager.AddCandidate(&webrtc.ICECandidateInit{
Candidate: payload["candidate"],
SDPMid: &sdpMid,
SDPMLineIndex: &SDPMLineIndex,
}, 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
}
}