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