mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-12-24 13:48:04 +08:00
68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
package webrtc
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/pion/webrtc/v4"
|
|
"m7s.live/v5"
|
|
"m7s.live/v5/pkg/util"
|
|
)
|
|
|
|
func NewPullProxy() m7s.IPullProxy {
|
|
return &PullProxy{}
|
|
}
|
|
|
|
type PullProxy struct {
|
|
Client
|
|
m7s.BasePullProxy
|
|
}
|
|
|
|
func (p *PullProxy) Start() (err error) {
|
|
err = p.Client.Start()
|
|
if err != nil {
|
|
return
|
|
}
|
|
p.OnConnectionStateChange(func(state webrtc.PeerConnectionState) {
|
|
p.Info("Connection State has changed:" + state.String())
|
|
switch state {
|
|
case webrtc.PeerConnectionStateConnected:
|
|
p.ChangeStatus(m7s.PullProxyStatusOnline)
|
|
case webrtc.PeerConnectionStateDisconnected, webrtc.PeerConnectionStateFailed, webrtc.PeerConnectionStateClosed:
|
|
p.ChangeStatus(m7s.PullProxyStatusOffline)
|
|
if !p.IsStopped() {
|
|
time.AfterFunc(p.CheckInterval, func() {
|
|
p.Start()
|
|
})
|
|
}
|
|
}
|
|
})
|
|
var sdpBody SDPBody
|
|
sdpBody.SessionDescription, err = p.GetOffer()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var res *http.Response
|
|
res, err = http.DefaultClient.Post(p.BasePullProxy.URL, "application/sdp", strings.NewReader(sdpBody.SessionDescription.SDP))
|
|
if err != nil {
|
|
return
|
|
}
|
|
if res.StatusCode != http.StatusCreated && res.StatusCode != http.StatusOK {
|
|
err = errors.New(res.Status)
|
|
return
|
|
}
|
|
var sd webrtc.SessionDescription
|
|
sd.Type = webrtc.SDPTypeAnswer
|
|
var body util.Buffer
|
|
io.Copy(&body, res.Body)
|
|
sd.SDP = string(body)
|
|
if err = p.SetRemoteDescription(sd); err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|