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 } }