diff --git a/internal/types/event/events.go b/internal/types/event/events.go index 7583e258..04eb4b2e 100644 --- a/internal/types/event/events.go +++ b/internal/types/event/events.go @@ -10,6 +10,7 @@ const ( const ( SIGNAL_REQUEST = "signal/request" SIGNAL_RESTART = "signal/restart" + SIGNAL_OFFER = "signal/offer" SIGNAL_ANSWER = "signal/answer" SIGNAL_PROVIDE = "signal/provide" SIGNAL_CANDIDATE = "signal/candidate" diff --git a/internal/types/message/messages.go b/internal/types/message/messages.go index 0365ea86..f4845a3a 100644 --- a/internal/types/message/messages.go +++ b/internal/types/message/messages.go @@ -56,7 +56,7 @@ type SignalCandidate struct { webrtc.ICECandidateInit } -type SignalAnswer struct { +type SignalDescription struct { SDP string `json:"sdp"` } diff --git a/internal/types/webrtc.go b/internal/types/webrtc.go index 45f84f13..19286f9c 100644 --- a/internal/types/webrtc.go +++ b/internal/types/webrtc.go @@ -19,6 +19,7 @@ type ICEServer struct { type WebRTCPeer interface { CreateOffer(ICERestart bool) (*webrtc.SessionDescription, error) + SignalOffer(sdp string) error SignalAnswer(sdp string) error SignalCandidate(candidate webrtc.ICECandidateInit) error diff --git a/internal/webrtc/peer.go b/internal/webrtc/peer.go index ad74d5d4..8acfa6ae 100644 --- a/internal/webrtc/peer.go +++ b/internal/webrtc/peer.go @@ -45,6 +45,13 @@ func (peer *WebRTCPeerCtx) CreateOffer(ICERestart bool) (*webrtc.SessionDescript return peer.connection.LocalDescription(), nil } +func (peer *WebRTCPeerCtx) SignalOffer(sdp string) error { + return peer.connection.SetRemoteDescription(webrtc.SessionDescription{ + SDP: sdp, + Type: webrtc.SDPTypeOffer, + }) +} + func (peer *WebRTCPeerCtx) SignalAnswer(sdp string) error { return peer.connection.SetRemoteDescription(webrtc.SessionDescription{ SDP: sdp, diff --git a/internal/websocket/handler/handler.go b/internal/websocket/handler/handler.go index b112cfb0..67a5bf85 100644 --- a/internal/websocket/handler/handler.go +++ b/internal/websocket/handler/handler.go @@ -56,8 +56,13 @@ func (h *MessageHandlerCtx) Message(session types.Session, data types.WebSocketM }) case event.SIGNAL_RESTART: err = h.signalRestart(session) + case event.SIGNAL_OFFER: + payload := &message.SignalDescription{} + err = utils.Unmarshal(payload, data.Payload, func() error { + return h.signalOffer(session, payload) + }) case event.SIGNAL_ANSWER: - payload := &message.SignalAnswer{} + payload := &message.SignalDescription{} err = utils.Unmarshal(payload, data.Payload, func() error { return h.signalAnswer(session, payload) }) diff --git a/internal/websocket/handler/signal.go b/internal/websocket/handler/signal.go index 873fc913..a319708b 100644 --- a/internal/websocket/handler/signal.go +++ b/internal/websocket/handler/signal.go @@ -48,14 +48,23 @@ func (h *MessageHandlerCtx) signalRestart(session types.Session) error { session.Send( event.SIGNAL_RESTART, - message.SignalAnswer{ + message.SignalDescription{ SDP: offer.SDP, }) return nil } -func (h *MessageHandlerCtx) signalAnswer(session types.Session, payload *message.SignalAnswer) error { +func (h *MessageHandlerCtx) signalOffer(session types.Session, payload *message.SignalDescription) error { + peer := session.GetWebRTCPeer() + if peer == nil { + return errors.New("webRTC peer does not exist") + } + + return peer.SignalOffer(payload.SDP) +} + +func (h *MessageHandlerCtx) signalAnswer(session types.Session, payload *message.SignalDescription) error { peer := session.GetWebRTCPeer() if peer == nil { return errors.New("webRTC peer does not exist")