add: basic webrtc is working
This commit is contained in:
+3
-2
@@ -10,5 +10,6 @@ plugins:
|
|||||||
- plugin: buf.build/connectrpc/go
|
- plugin: buf.build/connectrpc/go
|
||||||
out: gen
|
out: gen
|
||||||
opt: paths=source_relative
|
opt: paths=source_relative
|
||||||
- plugin: buf.build/protocolbuffers/dart:v21.1.1
|
- plugin: dart
|
||||||
out: gen
|
out: ui/lib/gen
|
||||||
|
opt: grpc
|
||||||
+37
-1
@@ -8,6 +8,9 @@ import (
|
|||||||
"connectrpc.com/grpcreflect"
|
"connectrpc.com/grpcreflect"
|
||||||
servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect"
|
servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect"
|
||||||
"github.com/chathaway-codes/home-sensors/v2/pkg/signaler"
|
"github.com/chathaway-codes/home-sensors/v2/pkg/signaler"
|
||||||
|
"github.com/rs/cors"
|
||||||
|
"golang.org/x/net/http2"
|
||||||
|
"golang.org/x/net/http2/h2c"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -26,7 +29,40 @@ func main() {
|
|||||||
fmt.Printf("Got path %s\n", path)
|
fmt.Printf("Got path %s\n", path)
|
||||||
mux.Handle(servicepb.NewSignalerServiceHandler(signaler.New()))
|
mux.Handle(servicepb.NewSignalerServiceHandler(signaler.New()))
|
||||||
|
|
||||||
if err := http.ListenAndServe("127.0.0.1:8080", mux); err != nil {
|
corsHandler := cors.New(cors.Options{
|
||||||
|
AllowedMethods: []string{
|
||||||
|
http.MethodGet,
|
||||||
|
http.MethodPost,
|
||||||
|
},
|
||||||
|
AllowedOrigins: []string{"example.com"},
|
||||||
|
AllowedHeaders: []string{
|
||||||
|
"Accept-Encoding",
|
||||||
|
"Authorization",
|
||||||
|
"Content-Encoding",
|
||||||
|
"Content-Type",
|
||||||
|
"Connect-Protocol-Version",
|
||||||
|
"Connect-Timeout-Ms",
|
||||||
|
"Connect-Accept-Encoding", // Unused in web browsers, but added for future-proofing
|
||||||
|
"Connect-Content-Encoding", // Unused in web browsers, but added for future-proofing
|
||||||
|
"Grpc-Timeout", // Used for gRPC-web
|
||||||
|
"X-Grpc-Web", // Used for gRPC-web
|
||||||
|
"X-User-Agent", // Used for gRPC-web
|
||||||
|
},
|
||||||
|
ExposedHeaders: []string{
|
||||||
|
"Content-Encoding", // Unused in web browsers, but added for future-proofing
|
||||||
|
"Connect-Content-Encoding", // Unused in web browsers, but added for future-proofing
|
||||||
|
"Grpc-Status", // Required for gRPC-web
|
||||||
|
"Grpc-Message", // Required for gRPC-web
|
||||||
|
},
|
||||||
|
})
|
||||||
|
handler := corsHandler.Handler(mux)
|
||||||
|
|
||||||
|
server := &http.Server{
|
||||||
|
Addr: "0.0.0.0:8080",
|
||||||
|
Handler: h2c.NewHandler(handler, &http2.Server{}),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := server.ListenAndServe(); err != nil {
|
||||||
log.Fatalf("Failed to listen for HTTP traffic: %v", err)
|
log.Fatalf("Failed to listen for HTTP traffic: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+201
-81
@@ -5,39 +5,61 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"connectrpc.com/connect"
|
"connectrpc.com/connect"
|
||||||
pb "github.com/chathaway-codes/home-sensors/v2/gen"
|
pb "github.com/chathaway-codes/home-sensors/v2/gen"
|
||||||
servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect"
|
servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/pion/webrtc/v3"
|
"github.com/pion/webrtc/v3"
|
||||||
"github.com/pion/webrtc/v3/pkg/media"
|
"github.com/pion/webrtc/v3/pkg/media"
|
||||||
"github.com/pion/webrtc/v3/pkg/media/h264reader"
|
"github.com/pion/webrtc/v3/pkg/media/ivfreader"
|
||||||
|
"google.golang.org/protobuf/encoding/prototext"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
var (
|
||||||
videoFileName = "/home/charles/Downloads/simpsons_movie_1080p_hddvd_trailer/The Simpsons Movie - 1080p Trailer.mp4"
|
videoFileName = flag.String("in", "/home/charles/Downloads/simpsons_movie_1080p_hddvd_trailer/output.ivf", "Where to load data from; if set to -, stdin will be used")
|
||||||
oggPageDuration = time.Millisecond * 20
|
|
||||||
h264FrameDuration = time.Millisecond * 33
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func withAuth[T any](token string, v *T) *connect.Request[T] {
|
func withAuth[T any](token string, v *T) *connect.Request[T] {
|
||||||
req := connect.NewRequest[T](v)
|
req := connect.NewRequest[T](v)
|
||||||
req.Header().Add("authorization", "Bearer "+token)
|
req.Header().Add("Authorization", "Bearer "+token)
|
||||||
return req
|
return req
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() { //nolint
|
func main() { //nolint
|
||||||
|
flag.Parse()
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
httpClient := &http.Client{}
|
|
||||||
client := servicepb.NewSignalerServiceClient(httpClient, "http://localhost:8080/")
|
/*httpClient := &http.Client{
|
||||||
|
Transport: &http2.Transport{
|
||||||
|
AllowHTTP: true,
|
||||||
|
DialTLS: func(network, addr string, _ *tls.Config) (net.Conn, error) {
|
||||||
|
// If you're also using this client for non-h2c traffic, you may want
|
||||||
|
// to delegate to tls.Dial if the network isn't TCP or the addr isn't
|
||||||
|
// in an allowlist.
|
||||||
|
log.Printf("Connecting to %s : %s", network, addr)
|
||||||
|
return net.Dial(network, addr)
|
||||||
|
},
|
||||||
|
// Don't forget timeouts!
|
||||||
|
},
|
||||||
|
}*/
|
||||||
|
vid, err := newVideo(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to start video: %v", err)
|
||||||
|
}
|
||||||
|
client := servicepb.NewSignalerServiceClient(http.DefaultClient, "http://192.168.0.65:8080/")
|
||||||
authToken, err := client.CreateAuthToken(ctx, connect.NewRequest(&pb.CreateAuthTokenRequest{
|
authToken, err := client.CreateAuthToken(ctx, connect.NewRequest(&pb.CreateAuthTokenRequest{
|
||||||
|
Home: "home1234",
|
||||||
Type: &pb.CreateAuthTokenRequest_Camera_{
|
Type: &pb.CreateAuthTokenRequest_Camera_{
|
||||||
Camera: &pb.CreateAuthTokenRequest_Camera{
|
Camera: &pb.CreateAuthTokenRequest_Camera{
|
||||||
Id: "movie",
|
Id: "movie",
|
||||||
@@ -48,20 +70,113 @@ func main() { //nolint
|
|||||||
log.Fatalf("Failed to get auth token: %v", err)
|
log.Fatalf("Failed to get auth token: %v", err)
|
||||||
}
|
}
|
||||||
token := authToken.Msg.GetToken()
|
token := authToken.Msg.GetToken()
|
||||||
|
log.Printf("Got token %s", prototext.Format(authToken.Msg))
|
||||||
// Assert that we have an audio or video file
|
|
||||||
_, err = os.Stat(videoFileName)
|
|
||||||
haveVideoFile := !os.IsNotExist(err)
|
|
||||||
|
|
||||||
iceConnectedCtx, iceConnectedCtxCancel := context.WithCancel(context.Background())
|
|
||||||
|
|
||||||
// Create a new RTCPeerConnection
|
// Create a new RTCPeerConnection
|
||||||
|
log.Printf("Waiting for connections")
|
||||||
|
|
||||||
|
for {
|
||||||
// Wait for a session request
|
// Wait for a session request
|
||||||
session, err := client.PopSession(ctx, withAuth(token, &pb.PopSessionRequest{}))
|
session, err := client.PopSession(ctx, withAuth(token, &pb.PopSessionRequest{}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error creating session: %v", err)
|
log.Fatalf("error creating session: %v", err)
|
||||||
}
|
}
|
||||||
|
go handleSession(ctx, client, token, session, vid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type video struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
listeners map[string]chan<- []byte
|
||||||
|
codec string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newVideo(ctx context.Context) (*video, error) {
|
||||||
|
var err error
|
||||||
|
// Assert that we have an audio or video file
|
||||||
|
videoFileName := *videoFileName
|
||||||
|
var videoIn io.Reader
|
||||||
|
if videoFileName == "-" {
|
||||||
|
videoIn = os.Stdin
|
||||||
|
} else {
|
||||||
|
videoIn, err = os.Open(videoFileName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open %q: %v", videoFileName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ivf, header, err := ivfreader.NewWith(videoIn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to read video: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine video codec
|
||||||
|
var trackCodec string
|
||||||
|
switch header.FourCC {
|
||||||
|
case "AV01":
|
||||||
|
trackCodec = webrtc.MimeTypeAV1
|
||||||
|
case "VP90":
|
||||||
|
trackCodec = webrtc.MimeTypeVP9
|
||||||
|
case "VP80":
|
||||||
|
trackCodec = webrtc.MimeTypeVP8
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unable to handle FourCC %s", header.FourCC)
|
||||||
|
}
|
||||||
|
|
||||||
|
vid := &video{
|
||||||
|
listeners: make(map[string]chan<- []byte),
|
||||||
|
codec: trackCodec,
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
// Send our video file frame at a time. Pace our sending so we send it at the same speed it should be played back as.
|
||||||
|
// This isn't required since the video is timestamped, but we will such much higher loss if we send all at once.
|
||||||
|
//
|
||||||
|
// It is important to use a time.Ticker instead of time.Sleep because
|
||||||
|
// * avoids accumulating skew, just calling time.Sleep didn't compensate for the time spent parsing the data
|
||||||
|
// * works around latency issues with Sleep (see https://github.com/golang/go/issues/44343)
|
||||||
|
ticker := time.NewTicker(time.Millisecond * time.Duration((float32(header.TimebaseNumerator)/float32(header.TimebaseDenominator))*1000))
|
||||||
|
for ; true; <-ticker.C {
|
||||||
|
frame, _, ivfErr := ivf.ParseNextFrame()
|
||||||
|
if errors.Is(ivfErr, io.EOF) {
|
||||||
|
fmt.Printf("All video frames parsed and sent")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ivfErr != nil {
|
||||||
|
panic(ivfErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
vid.mu.Lock()
|
||||||
|
for _, lis := range vid.listeners {
|
||||||
|
lis <- frame
|
||||||
|
}
|
||||||
|
vid.mu.Unlock()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return vid, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *video) Join() (<-chan []byte, string, func()) {
|
||||||
|
v.mu.Lock()
|
||||||
|
defer v.mu.Unlock()
|
||||||
|
|
||||||
|
myID := uuid.New().String()
|
||||||
|
ch := make(chan []byte)
|
||||||
|
v.listeners[myID] = ch
|
||||||
|
|
||||||
|
return ch, v.codec, func() {
|
||||||
|
v.mu.Lock()
|
||||||
|
defer v.mu.Unlock()
|
||||||
|
|
||||||
|
delete(v.listeners, myID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSession(ctx context.Context, client servicepb.SignalerServiceClient, token string, session *connect.Response[pb.Session], vid *video) {
|
||||||
|
var err error
|
||||||
|
log.Printf("New session")
|
||||||
|
|
||||||
peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{
|
peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{
|
||||||
ICEServers: []webrtc.ICEServer{
|
ICEServers: []webrtc.ICEServer{
|
||||||
{
|
{
|
||||||
@@ -69,25 +184,27 @@ func main() { //nolint
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
// We use the cancel func to signal that the stream is ready
|
||||||
}
|
iceConnectedCtx, iceConnectedCtxCancel := context.WithCancel(context.Background())
|
||||||
defer func() {
|
defer func() {
|
||||||
if cErr := peerConnection.Close(); cErr != nil {
|
if err := peerConnection.Close(); err != nil {
|
||||||
fmt.Printf("cannot close peerConnection: %v\n", cErr)
|
fmt.Printf("cannot close peerConnection: %v\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if haveVideoFile {
|
// connect to the video stream; the cleanup is done in the goroutine which
|
||||||
|
// consumes the framess
|
||||||
|
ch, trackCodec, cleanUp := vid.Join()
|
||||||
// Create a video track
|
// Create a video track
|
||||||
videoTrack, videoTrackErr := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion")
|
videoTrack, videoTrackErr := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: trackCodec}, "video", "pion")
|
||||||
if videoTrackErr != nil {
|
if videoTrackErr != nil {
|
||||||
panic(videoTrackErr)
|
log.Printf("Failed to create video track: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rtpSender, videoTrackErr := peerConnection.AddTrack(videoTrack)
|
rtpSender, err := peerConnection.AddTrack(videoTrack)
|
||||||
if videoTrackErr != nil {
|
if err != nil {
|
||||||
panic(videoTrackErr)
|
log.Printf("Failed to add track to connection: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read incoming RTCP packets
|
// Read incoming RTCP packets
|
||||||
@@ -96,50 +213,30 @@ func main() { //nolint
|
|||||||
go func() {
|
go func() {
|
||||||
rtcpBuf := make([]byte, 1500)
|
rtcpBuf := make([]byte, 1500)
|
||||||
for {
|
for {
|
||||||
if _, _, rtcpErr := rtpSender.Read(rtcpBuf); rtcpErr != nil {
|
if _, _, err := rtpSender.Read(rtcpBuf); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
// Open a H264 file and start reading using our IVFReader
|
defer cleanUp()
|
||||||
file, h264Err := os.Open(videoFileName)
|
readyToSend := false
|
||||||
if h264Err != nil {
|
for frame := range ch {
|
||||||
panic(h264Err)
|
select {
|
||||||
|
case <-iceConnectedCtx.Done():
|
||||||
|
readyToSend = true
|
||||||
|
default:
|
||||||
|
// do nothing
|
||||||
}
|
}
|
||||||
|
if !readyToSend {
|
||||||
h264, h264Err := h264reader.NewReader(file)
|
continue
|
||||||
if h264Err != nil {
|
|
||||||
panic(h264Err)
|
|
||||||
}
|
}
|
||||||
|
if err := videoTrack.WriteSample(media.Sample{Data: frame, Duration: time.Second}); err != nil {
|
||||||
// Wait for connection established
|
panic(err)
|
||||||
<-iceConnectedCtx.Done()
|
|
||||||
|
|
||||||
// Send our video file frame at a time. Pace our sending so we send it at the same speed it should be played back as.
|
|
||||||
// This isn't required since the video is timestamped, but we will such much higher loss if we send all at once.
|
|
||||||
//
|
|
||||||
// It is important to use a time.Ticker instead of time.Sleep because
|
|
||||||
// * avoids accumulating skew, just calling time.Sleep didn't compensate for the time spent parsing the data
|
|
||||||
// * works around latency issues with Sleep (see https://github.com/golang/go/issues/44343)
|
|
||||||
ticker := time.NewTicker(h264FrameDuration)
|
|
||||||
for ; true; <-ticker.C {
|
|
||||||
nal, h264Err := h264.NextNAL()
|
|
||||||
if h264Err == io.EOF {
|
|
||||||
fmt.Printf("All video frames parsed and sent")
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
||||||
if h264Err != nil {
|
|
||||||
panic(h264Err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if h264Err = videoTrack.WriteSample(media.Sample{Data: nal.Data, Duration: h264FrameDuration}); h264Err != nil {
|
|
||||||
panic(h264Err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
|
||||||
|
|
||||||
// Set the handler for ICE connection state
|
// Set the handler for ICE connection state
|
||||||
// This will notify you when the peer has connected/disconnected
|
// This will notify you when the peer has connected/disconnected
|
||||||
@@ -160,15 +257,27 @@ func main() { //nolint
|
|||||||
// Use webrtc.PeerConnectionStateDisconnected if you are interested in detecting faster timeout.
|
// Use webrtc.PeerConnectionStateDisconnected if you are interested in detecting faster timeout.
|
||||||
// Note that the PeerConnection may come back from PeerConnectionStateDisconnected.
|
// Note that the PeerConnection may come back from PeerConnectionStateDisconnected.
|
||||||
fmt.Println("Peer Connection has gone to failed exiting")
|
fmt.Println("Peer Connection has gone to failed exiting")
|
||||||
os.Exit(0)
|
return
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
|
peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) {
|
||||||
if i == nil {
|
if i == nil {
|
||||||
|
if _, err := client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{
|
||||||
|
SessionIdentifier: session.Msg.GetId(),
|
||||||
|
IceMessage: &pb.IceMessage{
|
||||||
|
Type: &pb.IceMessage_NoMoreCandidates{},
|
||||||
|
},
|
||||||
|
})); err != nil {
|
||||||
|
log.Fatalf("Error sending done w/ candidates: %v", err)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c := i.ToJSON()
|
c := i.ToJSON()
|
||||||
|
var usernameFragment *string
|
||||||
|
if c.UsernameFragment != nil {
|
||||||
|
usernameFragment = proto.String(*c.UsernameFragment)
|
||||||
|
}
|
||||||
client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{
|
client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{
|
||||||
SessionIdentifier: session.Msg.GetId(),
|
SessionIdentifier: session.Msg.GetId(),
|
||||||
IceMessage: &pb.IceMessage{
|
IceMessage: &pb.IceMessage{
|
||||||
@@ -177,22 +286,25 @@ func main() { //nolint
|
|||||||
Candidate: c.Candidate,
|
Candidate: c.Candidate,
|
||||||
SdpMid: c.SDPMid,
|
SdpMid: c.SDPMid,
|
||||||
SdpLineIndex: proto.Int32(int32(*c.SDPMLineIndex)),
|
SdpLineIndex: proto.Int32(int32(*c.SDPMLineIndex)),
|
||||||
UsernameFragment: proto.String(*c.UsernameFragment),
|
UsernameFragment: usernameFragment,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
log.Printf("Spawning helper")
|
||||||
|
|
||||||
|
// helper which sends answers, waits for
|
||||||
|
|
||||||
// Add ICE candidates from remote
|
// Add ICE candidates from remote
|
||||||
go func() {
|
|
||||||
for {
|
for {
|
||||||
msg, err := client.PopIceMessage(ctx, withAuth(token, &pb.PopIceMessageRequest{
|
msg, err := client.PopIceMessage(ctx, withAuth(token, &pb.PopIceMessageRequest{
|
||||||
SessionIdentifier: session.Msg.GetId(),
|
SessionIdentifier: session.Msg.GetId(),
|
||||||
}))
|
}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to pop ice message: %v", err)
|
log.Printf("failed to pop ice message: %v", err)
|
||||||
}
|
}
|
||||||
|
//log.Printf("Got ice message: %v", prototext.Format(msg.Msg))
|
||||||
switch msg.Msg.Type.(type) {
|
switch msg.Msg.Type.(type) {
|
||||||
case *pb.IceMessage_Candidate:
|
case *pb.IceMessage_Candidate:
|
||||||
candidate := msg.Msg.GetCandidate()
|
candidate := msg.Msg.GetCandidate()
|
||||||
@@ -208,27 +320,20 @@ func main() { //nolint
|
|||||||
}); err != nil {
|
}); err != nil {
|
||||||
log.Fatalf("Failed to add ice candidate: %v", err)
|
log.Fatalf("Failed to add ice candidate: %v", err)
|
||||||
}
|
}
|
||||||
case *pb.IceMessage_Session:
|
|
||||||
session := msg.Msg.GetSession()
|
|
||||||
|
|
||||||
offer := webrtc.SessionDescription{
|
|
||||||
Type: webrtc.SDPType(session.SdpType),
|
|
||||||
SDP: session.Sdp,
|
|
||||||
}
|
|
||||||
if err := peerConnection.SetLocalDescription(offer); err != nil {
|
|
||||||
log.Fatalf("Failed to set location description: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send back an answer
|
// Send back an answer
|
||||||
answer, err := peerConnection.CreateAnswer(nil)
|
answer, err := peerConnection.CreateAnswer(nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to create an answer: %v", err)
|
log.Printf("Candidate failed")
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if err := peerConnection.SetRemoteDescription(answer); err != nil {
|
|
||||||
log.Fatalf("Failed to set remote description: %v", err)
|
if err := peerConnection.SetLocalDescription(answer); err != nil {
|
||||||
|
log.Printf("Failed to set local description: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{
|
_, err = client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{
|
||||||
|
SessionIdentifier: session.Msg.GetId(),
|
||||||
IceMessage: &pb.IceMessage{
|
IceMessage: &pb.IceMessage{
|
||||||
Type: &pb.IceMessage_Session{
|
Type: &pb.IceMessage_Session{
|
||||||
Session: &pb.IceSessionDescription{
|
Session: &pb.IceSessionDescription{
|
||||||
@@ -239,12 +344,27 @@ func main() { //nolint
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to send answer: %v", err)
|
log.Printf("Failed to send answer: %v", err)
|
||||||
}
|
}
|
||||||
}
|
case *pb.IceMessage_Session:
|
||||||
}
|
iceSession := msg.Msg.GetSession()
|
||||||
}()
|
|
||||||
|
|
||||||
// Block forever
|
switch iceSession.SdpType {
|
||||||
select {}
|
case int64(webrtc.SDPTypeOffer):
|
||||||
|
offer := webrtc.SessionDescription{
|
||||||
|
Type: webrtc.SDPType(iceSession.SdpType),
|
||||||
|
SDP: iceSession.Sdp,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := peerConnection.SetRemoteDescription(offer); err != nil {
|
||||||
|
log.Fatalf("Failed to set remote description: %v", err)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
log.Printf("unexpected sdp type: %v", webrtc.SDPType(iceSession.SdpType).String())
|
||||||
|
}
|
||||||
|
log.Printf("Accepted promise!")
|
||||||
|
case *pb.IceMessage_NoMoreCandidates:
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+144
-71
@@ -601,6 +601,7 @@ type IceMessage struct {
|
|||||||
//
|
//
|
||||||
// *IceMessage_Candidate
|
// *IceMessage_Candidate
|
||||||
// *IceMessage_Session
|
// *IceMessage_Session
|
||||||
|
// *IceMessage_NoMoreCandidates
|
||||||
Type isIceMessage_Type `protobuf_oneof:"type"`
|
Type isIceMessage_Type `protobuf_oneof:"type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -657,6 +658,13 @@ func (x *IceMessage) GetSession() *IceSessionDescription {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *IceMessage) GetNoMoreCandidates() *NoMoreCandidates {
|
||||||
|
if x, ok := x.GetType().(*IceMessage_NoMoreCandidates); ok {
|
||||||
|
return x.NoMoreCandidates
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type isIceMessage_Type interface {
|
type isIceMessage_Type interface {
|
||||||
isIceMessage_Type()
|
isIceMessage_Type()
|
||||||
}
|
}
|
||||||
@@ -669,10 +677,54 @@ type IceMessage_Session struct {
|
|||||||
Session *IceSessionDescription `protobuf:"bytes,2,opt,name=session,proto3,oneof"`
|
Session *IceSessionDescription `protobuf:"bytes,2,opt,name=session,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IceMessage_NoMoreCandidates struct {
|
||||||
|
NoMoreCandidates *NoMoreCandidates `protobuf:"bytes,3,opt,name=no_more_candidates,json=noMoreCandidates,proto3,oneof"`
|
||||||
|
}
|
||||||
|
|
||||||
func (*IceMessage_Candidate) isIceMessage_Type() {}
|
func (*IceMessage_Candidate) isIceMessage_Type() {}
|
||||||
|
|
||||||
func (*IceMessage_Session) isIceMessage_Type() {}
|
func (*IceMessage_Session) isIceMessage_Type() {}
|
||||||
|
|
||||||
|
func (*IceMessage_NoMoreCandidates) isIceMessage_Type() {}
|
||||||
|
|
||||||
|
type NoMoreCandidates struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NoMoreCandidates) Reset() {
|
||||||
|
*x = NoMoreCandidates{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_signaler_service_proto_msgTypes[12]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *NoMoreCandidates) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*NoMoreCandidates) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *NoMoreCandidates) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_signaler_service_proto_msgTypes[12]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use NoMoreCandidates.ProtoReflect.Descriptor instead.
|
||||||
|
func (*NoMoreCandidates) Descriptor() ([]byte, []int) {
|
||||||
|
return file_signaler_service_proto_rawDescGZIP(), []int{12}
|
||||||
|
}
|
||||||
|
|
||||||
type IceCandidate struct {
|
type IceCandidate struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@@ -688,7 +740,7 @@ type IceCandidate struct {
|
|||||||
func (x *IceCandidate) Reset() {
|
func (x *IceCandidate) Reset() {
|
||||||
*x = IceCandidate{}
|
*x = IceCandidate{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[12]
|
mi := &file_signaler_service_proto_msgTypes[13]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -701,7 +753,7 @@ func (x *IceCandidate) String() string {
|
|||||||
func (*IceCandidate) ProtoMessage() {}
|
func (*IceCandidate) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *IceCandidate) ProtoReflect() protoreflect.Message {
|
func (x *IceCandidate) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[12]
|
mi := &file_signaler_service_proto_msgTypes[13]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -714,7 +766,7 @@ func (x *IceCandidate) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use IceCandidate.ProtoReflect.Descriptor instead.
|
// Deprecated: Use IceCandidate.ProtoReflect.Descriptor instead.
|
||||||
func (*IceCandidate) Descriptor() ([]byte, []int) {
|
func (*IceCandidate) Descriptor() ([]byte, []int) {
|
||||||
return file_signaler_service_proto_rawDescGZIP(), []int{12}
|
return file_signaler_service_proto_rawDescGZIP(), []int{13}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *IceCandidate) GetCandidate() string {
|
func (x *IceCandidate) GetCandidate() string {
|
||||||
@@ -758,7 +810,7 @@ type IceSessionDescription struct {
|
|||||||
func (x *IceSessionDescription) Reset() {
|
func (x *IceSessionDescription) Reset() {
|
||||||
*x = IceSessionDescription{}
|
*x = IceSessionDescription{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[13]
|
mi := &file_signaler_service_proto_msgTypes[14]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -771,7 +823,7 @@ func (x *IceSessionDescription) String() string {
|
|||||||
func (*IceSessionDescription) ProtoMessage() {}
|
func (*IceSessionDescription) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *IceSessionDescription) ProtoReflect() protoreflect.Message {
|
func (x *IceSessionDescription) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[13]
|
mi := &file_signaler_service_proto_msgTypes[14]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -784,7 +836,7 @@ func (x *IceSessionDescription) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use IceSessionDescription.ProtoReflect.Descriptor instead.
|
// Deprecated: Use IceSessionDescription.ProtoReflect.Descriptor instead.
|
||||||
func (*IceSessionDescription) Descriptor() ([]byte, []int) {
|
func (*IceSessionDescription) Descriptor() ([]byte, []int) {
|
||||||
return file_signaler_service_proto_rawDescGZIP(), []int{13}
|
return file_signaler_service_proto_rawDescGZIP(), []int{14}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *IceSessionDescription) GetSdpType() int64 {
|
func (x *IceSessionDescription) GetSdpType() int64 {
|
||||||
@@ -813,7 +865,7 @@ type Session struct {
|
|||||||
func (x *Session) Reset() {
|
func (x *Session) Reset() {
|
||||||
*x = Session{}
|
*x = Session{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[14]
|
mi := &file_signaler_service_proto_msgTypes[15]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -826,7 +878,7 @@ func (x *Session) String() string {
|
|||||||
func (*Session) ProtoMessage() {}
|
func (*Session) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Session) ProtoReflect() protoreflect.Message {
|
func (x *Session) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[14]
|
mi := &file_signaler_service_proto_msgTypes[15]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -839,7 +891,7 @@ func (x *Session) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Session.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Session.ProtoReflect.Descriptor instead.
|
||||||
func (*Session) Descriptor() ([]byte, []int) {
|
func (*Session) Descriptor() ([]byte, []int) {
|
||||||
return file_signaler_service_proto_rawDescGZIP(), []int{14}
|
return file_signaler_service_proto_rawDescGZIP(), []int{15}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Session) GetId() *Session_Identifier {
|
func (x *Session) GetId() *Session_Identifier {
|
||||||
@@ -867,7 +919,7 @@ type AuthToken struct {
|
|||||||
func (x *AuthToken) Reset() {
|
func (x *AuthToken) Reset() {
|
||||||
*x = AuthToken{}
|
*x = AuthToken{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[15]
|
mi := &file_signaler_service_proto_msgTypes[16]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -880,7 +932,7 @@ func (x *AuthToken) String() string {
|
|||||||
func (*AuthToken) ProtoMessage() {}
|
func (*AuthToken) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *AuthToken) ProtoReflect() protoreflect.Message {
|
func (x *AuthToken) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[15]
|
mi := &file_signaler_service_proto_msgTypes[16]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -893,7 +945,7 @@ func (x *AuthToken) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use AuthToken.ProtoReflect.Descriptor instead.
|
// Deprecated: Use AuthToken.ProtoReflect.Descriptor instead.
|
||||||
func (*AuthToken) Descriptor() ([]byte, []int) {
|
func (*AuthToken) Descriptor() ([]byte, []int) {
|
||||||
return file_signaler_service_proto_rawDescGZIP(), []int{15}
|
return file_signaler_service_proto_rawDescGZIP(), []int{16}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *AuthToken) GetToken() string {
|
func (x *AuthToken) GetToken() string {
|
||||||
@@ -916,7 +968,7 @@ type CreateAuthTokenRequest_Camera struct {
|
|||||||
func (x *CreateAuthTokenRequest_Camera) Reset() {
|
func (x *CreateAuthTokenRequest_Camera) Reset() {
|
||||||
*x = CreateAuthTokenRequest_Camera{}
|
*x = CreateAuthTokenRequest_Camera{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[16]
|
mi := &file_signaler_service_proto_msgTypes[17]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -929,7 +981,7 @@ func (x *CreateAuthTokenRequest_Camera) String() string {
|
|||||||
func (*CreateAuthTokenRequest_Camera) ProtoMessage() {}
|
func (*CreateAuthTokenRequest_Camera) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *CreateAuthTokenRequest_Camera) ProtoReflect() protoreflect.Message {
|
func (x *CreateAuthTokenRequest_Camera) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[16]
|
mi := &file_signaler_service_proto_msgTypes[17]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -961,7 +1013,7 @@ type CreateAuthTokenRequest_Client struct {
|
|||||||
func (x *CreateAuthTokenRequest_Client) Reset() {
|
func (x *CreateAuthTokenRequest_Client) Reset() {
|
||||||
*x = CreateAuthTokenRequest_Client{}
|
*x = CreateAuthTokenRequest_Client{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[17]
|
mi := &file_signaler_service_proto_msgTypes[18]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -974,7 +1026,7 @@ func (x *CreateAuthTokenRequest_Client) String() string {
|
|||||||
func (*CreateAuthTokenRequest_Client) ProtoMessage() {}
|
func (*CreateAuthTokenRequest_Client) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *CreateAuthTokenRequest_Client) ProtoReflect() protoreflect.Message {
|
func (x *CreateAuthTokenRequest_Client) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[17]
|
mi := &file_signaler_service_proto_msgTypes[18]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -1001,7 +1053,7 @@ type Camera_Identifier struct {
|
|||||||
func (x *Camera_Identifier) Reset() {
|
func (x *Camera_Identifier) Reset() {
|
||||||
*x = Camera_Identifier{}
|
*x = Camera_Identifier{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[18]
|
mi := &file_signaler_service_proto_msgTypes[19]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -1014,7 +1066,7 @@ func (x *Camera_Identifier) String() string {
|
|||||||
func (*Camera_Identifier) ProtoMessage() {}
|
func (*Camera_Identifier) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Camera_Identifier) ProtoReflect() protoreflect.Message {
|
func (x *Camera_Identifier) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[18]
|
mi := &file_signaler_service_proto_msgTypes[19]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -1048,7 +1100,7 @@ type Session_Identifier struct {
|
|||||||
func (x *Session_Identifier) Reset() {
|
func (x *Session_Identifier) Reset() {
|
||||||
*x = Session_Identifier{}
|
*x = Session_Identifier{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_signaler_service_proto_msgTypes[19]
|
mi := &file_signaler_service_proto_msgTypes[20]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@@ -1061,7 +1113,7 @@ func (x *Session_Identifier) String() string {
|
|||||||
func (*Session_Identifier) ProtoMessage() {}
|
func (*Session_Identifier) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Session_Identifier) ProtoReflect() protoreflect.Message {
|
func (x *Session_Identifier) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_signaler_service_proto_msgTypes[19]
|
mi := &file_signaler_service_proto_msgTypes[20]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@@ -1074,7 +1126,7 @@ func (x *Session_Identifier) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Session_Identifier.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Session_Identifier.ProtoReflect.Descriptor instead.
|
||||||
func (*Session_Identifier) Descriptor() ([]byte, []int) {
|
func (*Session_Identifier) Descriptor() ([]byte, []int) {
|
||||||
return file_signaler_service_proto_rawDescGZIP(), []int{14, 0}
|
return file_signaler_service_proto_rawDescGZIP(), []int{15, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Session_Identifier) GetId() string {
|
func (x *Session_Identifier) GetId() string {
|
||||||
@@ -1155,7 +1207,7 @@ var file_signaler_service_proto_rawDesc = []byte{
|
|||||||
0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
|
0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69,
|
||||||
0x65, 0x72, 0x1a, 0x1c, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
|
0x65, 0x72, 0x1a, 0x1c, 0x0a, 0x0a, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
|
||||||
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
|
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
|
||||||
0x22, 0x89, 0x01, 0x0a, 0x0a, 0x49, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
|
0x22, 0xd5, 0x01, 0x0a, 0x0a, 0x49, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
|
||||||
0x36, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01,
|
0x36, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01,
|
||||||
0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63,
|
0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63,
|
||||||
0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61,
|
0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61,
|
||||||
@@ -1163,7 +1215,13 @@ var file_signaler_service_proto_rawDesc = []byte{
|
|||||||
0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61,
|
0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61,
|
||||||
0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65,
|
0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65,
|
||||||
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x73,
|
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x73,
|
||||||
0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xdc, 0x01, 0x0a,
|
0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x12, 0x6e, 0x6f, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x5f,
|
||||||
|
0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x1a, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x4e, 0x6f, 0x4d, 0x6f,
|
||||||
|
0x72, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x10,
|
||||||
|
0x6e, 0x6f, 0x4d, 0x6f, 0x72, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73,
|
||||||
|
0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4e, 0x6f, 0x4d, 0x6f,
|
||||||
|
0x72, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0xdc, 0x01, 0x0a,
|
||||||
0x0c, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a,
|
0x0c, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a,
|
||||||
0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||||
0x52, 0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x07, 0x73,
|
0x52, 0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x07, 0x73,
|
||||||
@@ -1245,7 +1303,7 @@ func file_signaler_service_proto_rawDescGZIP() []byte {
|
|||||||
return file_signaler_service_proto_rawDescData
|
return file_signaler_service_proto_rawDescData
|
||||||
}
|
}
|
||||||
|
|
||||||
var file_signaler_service_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
|
var file_signaler_service_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
|
||||||
var file_signaler_service_proto_goTypes = []interface{}{
|
var file_signaler_service_proto_goTypes = []interface{}{
|
||||||
(*CreateAuthTokenRequest)(nil), // 0: signaler.CreateAuthTokenRequest
|
(*CreateAuthTokenRequest)(nil), // 0: signaler.CreateAuthTokenRequest
|
||||||
(*ListCamerasRequest)(nil), // 1: signaler.ListCamerasRequest
|
(*ListCamerasRequest)(nil), // 1: signaler.ListCamerasRequest
|
||||||
@@ -1259,48 +1317,50 @@ var file_signaler_service_proto_goTypes = []interface{}{
|
|||||||
(*PopIceMessageRequest)(nil), // 9: signaler.PopIceMessageRequest
|
(*PopIceMessageRequest)(nil), // 9: signaler.PopIceMessageRequest
|
||||||
(*Camera)(nil), // 10: signaler.Camera
|
(*Camera)(nil), // 10: signaler.Camera
|
||||||
(*IceMessage)(nil), // 11: signaler.IceMessage
|
(*IceMessage)(nil), // 11: signaler.IceMessage
|
||||||
(*IceCandidate)(nil), // 12: signaler.IceCandidate
|
(*NoMoreCandidates)(nil), // 12: signaler.NoMoreCandidates
|
||||||
(*IceSessionDescription)(nil), // 13: signaler.IceSessionDescription
|
(*IceCandidate)(nil), // 13: signaler.IceCandidate
|
||||||
(*Session)(nil), // 14: signaler.Session
|
(*IceSessionDescription)(nil), // 14: signaler.IceSessionDescription
|
||||||
(*AuthToken)(nil), // 15: signaler.AuthToken
|
(*Session)(nil), // 15: signaler.Session
|
||||||
(*CreateAuthTokenRequest_Camera)(nil), // 16: signaler.CreateAuthTokenRequest.Camera
|
(*AuthToken)(nil), // 16: signaler.AuthToken
|
||||||
(*CreateAuthTokenRequest_Client)(nil), // 17: signaler.CreateAuthTokenRequest.Client
|
(*CreateAuthTokenRequest_Camera)(nil), // 17: signaler.CreateAuthTokenRequest.Camera
|
||||||
(*Camera_Identifier)(nil), // 18: signaler.Camera.Identifier
|
(*CreateAuthTokenRequest_Client)(nil), // 18: signaler.CreateAuthTokenRequest.Client
|
||||||
(*Session_Identifier)(nil), // 19: signaler.Session.Identifier
|
(*Camera_Identifier)(nil), // 19: signaler.Camera.Identifier
|
||||||
|
(*Session_Identifier)(nil), // 20: signaler.Session.Identifier
|
||||||
}
|
}
|
||||||
var file_signaler_service_proto_depIdxs = []int32{
|
var file_signaler_service_proto_depIdxs = []int32{
|
||||||
16, // 0: signaler.CreateAuthTokenRequest.camera:type_name -> signaler.CreateAuthTokenRequest.Camera
|
17, // 0: signaler.CreateAuthTokenRequest.camera:type_name -> signaler.CreateAuthTokenRequest.Camera
|
||||||
17, // 1: signaler.CreateAuthTokenRequest.client:type_name -> signaler.CreateAuthTokenRequest.Client
|
18, // 1: signaler.CreateAuthTokenRequest.client:type_name -> signaler.CreateAuthTokenRequest.Client
|
||||||
10, // 2: signaler.ListCamerasResponse.cameras:type_name -> signaler.Camera
|
10, // 2: signaler.ListCamerasResponse.cameras:type_name -> signaler.Camera
|
||||||
14, // 3: signaler.CreateSessionRequest.session:type_name -> signaler.Session
|
15, // 3: signaler.CreateSessionRequest.session:type_name -> signaler.Session
|
||||||
14, // 4: signaler.PopSessionRequest.session:type_name -> signaler.Session
|
15, // 4: signaler.PopSessionRequest.session:type_name -> signaler.Session
|
||||||
14, // 5: signaler.UpdateSessionRequest.session:type_name -> signaler.Session
|
15, // 5: signaler.UpdateSessionRequest.session:type_name -> signaler.Session
|
||||||
14, // 6: signaler.ListSessionsResponse.sessions:type_name -> signaler.Session
|
15, // 6: signaler.ListSessionsResponse.sessions:type_name -> signaler.Session
|
||||||
19, // 7: signaler.CreateIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier
|
20, // 7: signaler.CreateIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier
|
||||||
11, // 8: signaler.CreateIceMessageRequest.ice_message:type_name -> signaler.IceMessage
|
11, // 8: signaler.CreateIceMessageRequest.ice_message:type_name -> signaler.IceMessage
|
||||||
19, // 9: signaler.PopIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier
|
20, // 9: signaler.PopIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier
|
||||||
18, // 10: signaler.Camera.identifier:type_name -> signaler.Camera.Identifier
|
19, // 10: signaler.Camera.identifier:type_name -> signaler.Camera.Identifier
|
||||||
12, // 11: signaler.IceMessage.candidate:type_name -> signaler.IceCandidate
|
13, // 11: signaler.IceMessage.candidate:type_name -> signaler.IceCandidate
|
||||||
13, // 12: signaler.IceMessage.session:type_name -> signaler.IceSessionDescription
|
14, // 12: signaler.IceMessage.session:type_name -> signaler.IceSessionDescription
|
||||||
19, // 13: signaler.Session.id:type_name -> signaler.Session.Identifier
|
12, // 13: signaler.IceMessage.no_more_candidates:type_name -> signaler.NoMoreCandidates
|
||||||
18, // 14: signaler.Session.camera:type_name -> signaler.Camera.Identifier
|
20, // 14: signaler.Session.id:type_name -> signaler.Session.Identifier
|
||||||
0, // 15: signaler.SignalerService.CreateAuthToken:input_type -> signaler.CreateAuthTokenRequest
|
19, // 15: signaler.Session.camera:type_name -> signaler.Camera.Identifier
|
||||||
1, // 16: signaler.SignalerService.ListCameras:input_type -> signaler.ListCamerasRequest
|
0, // 16: signaler.SignalerService.CreateAuthToken:input_type -> signaler.CreateAuthTokenRequest
|
||||||
3, // 17: signaler.SignalerService.CreateSession:input_type -> signaler.CreateSessionRequest
|
1, // 17: signaler.SignalerService.ListCameras:input_type -> signaler.ListCamerasRequest
|
||||||
4, // 18: signaler.SignalerService.PopSession:input_type -> signaler.PopSessionRequest
|
3, // 18: signaler.SignalerService.CreateSession:input_type -> signaler.CreateSessionRequest
|
||||||
8, // 19: signaler.SignalerService.CreateIceMessage:input_type -> signaler.CreateIceMessageRequest
|
4, // 19: signaler.SignalerService.PopSession:input_type -> signaler.PopSessionRequest
|
||||||
9, // 20: signaler.SignalerService.PopIceMessage:input_type -> signaler.PopIceMessageRequest
|
8, // 20: signaler.SignalerService.CreateIceMessage:input_type -> signaler.CreateIceMessageRequest
|
||||||
15, // 21: signaler.SignalerService.CreateAuthToken:output_type -> signaler.AuthToken
|
9, // 21: signaler.SignalerService.PopIceMessage:input_type -> signaler.PopIceMessageRequest
|
||||||
2, // 22: signaler.SignalerService.ListCameras:output_type -> signaler.ListCamerasResponse
|
16, // 22: signaler.SignalerService.CreateAuthToken:output_type -> signaler.AuthToken
|
||||||
14, // 23: signaler.SignalerService.CreateSession:output_type -> signaler.Session
|
2, // 23: signaler.SignalerService.ListCameras:output_type -> signaler.ListCamerasResponse
|
||||||
14, // 24: signaler.SignalerService.PopSession:output_type -> signaler.Session
|
15, // 24: signaler.SignalerService.CreateSession:output_type -> signaler.Session
|
||||||
11, // 25: signaler.SignalerService.CreateIceMessage:output_type -> signaler.IceMessage
|
15, // 25: signaler.SignalerService.PopSession:output_type -> signaler.Session
|
||||||
11, // 26: signaler.SignalerService.PopIceMessage:output_type -> signaler.IceMessage
|
11, // 26: signaler.SignalerService.CreateIceMessage:output_type -> signaler.IceMessage
|
||||||
21, // [21:27] is the sub-list for method output_type
|
11, // 27: signaler.SignalerService.PopIceMessage:output_type -> signaler.IceMessage
|
||||||
15, // [15:21] is the sub-list for method input_type
|
22, // [22:28] is the sub-list for method output_type
|
||||||
15, // [15:15] is the sub-list for extension type_name
|
16, // [16:22] is the sub-list for method input_type
|
||||||
15, // [15:15] is the sub-list for extension extendee
|
16, // [16:16] is the sub-list for extension type_name
|
||||||
0, // [0:15] is the sub-list for field type_name
|
16, // [16:16] is the sub-list for extension extendee
|
||||||
|
0, // [0:16] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_signaler_service_proto_init() }
|
func init() { file_signaler_service_proto_init() }
|
||||||
@@ -1454,7 +1514,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*IceCandidate); i {
|
switch v := v.(*NoMoreCandidates); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1466,7 +1526,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*IceSessionDescription); i {
|
switch v := v.(*IceCandidate); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1478,7 +1538,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Session); i {
|
switch v := v.(*IceSessionDescription); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1490,7 +1550,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*AuthToken); i {
|
switch v := v.(*Session); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1502,7 +1562,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*CreateAuthTokenRequest_Camera); i {
|
switch v := v.(*AuthToken); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1514,7 +1574,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*CreateAuthTokenRequest_Client); i {
|
switch v := v.(*CreateAuthTokenRequest_Camera); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1526,7 +1586,7 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Camera_Identifier); i {
|
switch v := v.(*CreateAuthTokenRequest_Client); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1538,6 +1598,18 @@ func file_signaler_service_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
|
file_signaler_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*Camera_Identifier); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_signaler_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Session_Identifier); i {
|
switch v := v.(*Session_Identifier); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
@@ -1557,15 +1629,16 @@ func file_signaler_service_proto_init() {
|
|||||||
file_signaler_service_proto_msgTypes[11].OneofWrappers = []interface{}{
|
file_signaler_service_proto_msgTypes[11].OneofWrappers = []interface{}{
|
||||||
(*IceMessage_Candidate)(nil),
|
(*IceMessage_Candidate)(nil),
|
||||||
(*IceMessage_Session)(nil),
|
(*IceMessage_Session)(nil),
|
||||||
|
(*IceMessage_NoMoreCandidates)(nil),
|
||||||
}
|
}
|
||||||
file_signaler_service_proto_msgTypes[12].OneofWrappers = []interface{}{}
|
file_signaler_service_proto_msgTypes[13].OneofWrappers = []interface{}{}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_signaler_service_proto_rawDesc,
|
RawDescriptor: file_signaler_service_proto_rawDesc,
|
||||||
NumEnums: 0,
|
NumEnums: 0,
|
||||||
NumMessages: 20,
|
NumMessages: 21,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 1,
|
NumServices: 1,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,8 +6,9 @@ require (
|
|||||||
connectrpc.com/connect v1.11.1
|
connectrpc.com/connect v1.11.1
|
||||||
connectrpc.com/grpcreflect v1.2.0
|
connectrpc.com/grpcreflect v1.2.0
|
||||||
github.com/gofrs/uuid/v5 v5.0.0
|
github.com/gofrs/uuid/v5 v5.0.0
|
||||||
github.com/pion/example-webrtc-applications/v3 v3.0.5
|
|
||||||
github.com/pion/webrtc/v3 v3.2.20
|
github.com/pion/webrtc/v3 v3.2.20
|
||||||
|
github.com/rs/cors v1.10.0
|
||||||
|
golang.org/x/net v0.14.0
|
||||||
google.golang.org/grpc v1.58.1
|
google.golang.org/grpc v1.58.1
|
||||||
google.golang.org/protobuf v1.31.0
|
google.golang.org/protobuf v1.31.0
|
||||||
)
|
)
|
||||||
@@ -34,8 +35,8 @@ require (
|
|||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/stretchr/testify v1.8.4 // indirect
|
github.com/stretchr/testify v1.8.4 // indirect
|
||||||
golang.org/x/crypto v0.12.0 // indirect
|
golang.org/x/crypto v0.12.0 // indirect
|
||||||
golang.org/x/net v0.14.0 // indirect
|
|
||||||
golang.org/x/sys v0.11.0 // indirect
|
golang.org/x/sys v0.11.0 // indirect
|
||||||
|
golang.org/x/text v0.12.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ connectrpc.com/connect v1.11.1 h1:dqRwblixqkVh+OFBOOL1yIf1jS/yP0MSJLijRj29bFg=
|
|||||||
connectrpc.com/connect v1.11.1/go.mod h1:3AGaO6RRGMx5IKFfqbe3hvK1NqLosFNP2BxDYTPmNPo=
|
connectrpc.com/connect v1.11.1/go.mod h1:3AGaO6RRGMx5IKFfqbe3hvK1NqLosFNP2BxDYTPmNPo=
|
||||||
connectrpc.com/grpcreflect v1.2.0 h1:Q6og1S7HinmtbEuBvARLNwYmTbhEGRpHDhqrPNlmK+U=
|
connectrpc.com/grpcreflect v1.2.0 h1:Q6og1S7HinmtbEuBvARLNwYmTbhEGRpHDhqrPNlmK+U=
|
||||||
connectrpc.com/grpcreflect v1.2.0/go.mod h1:nwSOKmE8nU5u/CidgHtPYk1PFI3U9ignz7iDMxOYkSY=
|
connectrpc.com/grpcreflect v1.2.0/go.mod h1:nwSOKmE8nU5u/CidgHtPYk1PFI3U9ignz7iDMxOYkSY=
|
||||||
github.com/at-wat/ebml-go v0.16.0/go.mod h1:w1cJs7zmGsb5nnSvhWGKLCxvfu4FVx5ERvYDIalj1ww=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@@ -18,7 +17,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
|
|||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
@@ -29,102 +27,69 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
||||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs=
|
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/notedit/janus-go v0.0.0-20210115013133-fdce1b146d0e/go.mod h1:BN/Txse3qz8tZOmCm2OfajB2wHVujWmX3o9nVdsI6gE=
|
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
|
||||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
|
|
||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg=
|
|
||||||
github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8=
|
github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8=
|
||||||
github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0=
|
github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0=
|
||||||
github.com/pion/dtls/v2 v2.0.9/go.mod h1:O0Wr7si/Zj5/EBFlDzDd6UtVxx25CE1r7XM7BQKYQho=
|
|
||||||
github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8=
|
github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8=
|
||||||
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
|
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
|
||||||
github.com/pion/example-webrtc-applications/v3 v3.0.5 h1:Bycp74ODTRa+zKa6dpy3uHOW/kwg2XEBmGjFTWfVPpA=
|
|
||||||
github.com/pion/example-webrtc-applications/v3 v3.0.5/go.mod h1:jQDdp7mkpHvTtw8GC77xPdVYUuiALSJVdFG3FYYBs4A=
|
|
||||||
github.com/pion/ice/v2 v2.1.10/go.mod h1:kV4EODVD5ux2z8XncbLHIOtcXKtYXVgLVCeVqnpoeP0=
|
|
||||||
github.com/pion/ice/v2 v2.1.12/go.mod h1:ovgYHUmwYLlRvcCLI67PnQ5YGe+upXZbGgllBDG/ktU=
|
|
||||||
github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw=
|
github.com/pion/ice/v2 v2.3.11 h1:rZjVmUwyT55cmN8ySMpL7rsS8KYsJERsrxJLLxpKhdw=
|
||||||
github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E=
|
github.com/pion/ice/v2 v2.3.11/go.mod h1:hPcLC3kxMa+JGRzMHqQzjoSj3xtE9F+eoncmXLlCL4E=
|
||||||
github.com/pion/interceptor v0.0.15/go.mod h1:pg3J253eGi5bqyKzA74+ej5Y19ez2jkWANVnF+Z9Dfk=
|
|
||||||
github.com/pion/interceptor v0.1.18 h1:Hk26334NUQeUcJNR27YHYKT+sWNhhegQ9KFz5Nn6yMQ=
|
github.com/pion/interceptor v0.1.18 h1:Hk26334NUQeUcJNR27YHYKT+sWNhhegQ9KFz5Nn6yMQ=
|
||||||
github.com/pion/interceptor v0.1.18/go.mod h1:tpvvF4cPM6NGxFA1DUMbhabzQBxdWMATDGEUYOR9x6I=
|
github.com/pion/interceptor v0.1.18/go.mod h1:tpvvF4cPM6NGxFA1DUMbhabzQBxdWMATDGEUYOR9x6I=
|
||||||
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
|
||||||
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
|
||||||
github.com/pion/mdns v0.0.5/go.mod h1:UgssrvdD3mxpi8tMxAXbsppL3vJ4Jipw1mTCW+al01g=
|
|
||||||
github.com/pion/mdns v0.0.8 h1:HhicWIg7OX5PVilyBO6plhMetInbzkVJAhbdJiAeVaI=
|
github.com/pion/mdns v0.0.8 h1:HhicWIg7OX5PVilyBO6plhMetInbzkVJAhbdJiAeVaI=
|
||||||
github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI=
|
github.com/pion/mdns v0.0.8/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI=
|
||||||
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
|
||||||
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
|
||||||
github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0=
|
|
||||||
github.com/pion/rtcp v1.2.10 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc=
|
github.com/pion/rtcp v1.2.10 h1:nkr3uj+8Sp97zyItdN60tE/S6vk4al5CPRR6Gejsdjc=
|
||||||
github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I=
|
github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I=
|
||||||
github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
|
||||||
github.com/pion/rtp v1.7.1/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko=
|
|
||||||
github.com/pion/rtp v1.8.1 h1:26OxTc6lKg/qLSGir5agLyj0QKaOv8OP5wps2SFnVNQ=
|
github.com/pion/rtp v1.8.1 h1:26OxTc6lKg/qLSGir5agLyj0QKaOv8OP5wps2SFnVNQ=
|
||||||
github.com/pion/rtp v1.8.1/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
|
github.com/pion/rtp v1.8.1/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
|
||||||
github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0=
|
|
||||||
github.com/pion/sctp v1.7.12/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s=
|
|
||||||
github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0=
|
github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0=
|
||||||
github.com/pion/sctp v1.8.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U=
|
github.com/pion/sctp v1.8.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U=
|
||||||
github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs=
|
github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs=
|
||||||
github.com/pion/sdp/v2 v2.4.0/go.mod h1:L2LxrOpSTJbAns244vfPChbciR/ReU1KWfG04OpkR7E=
|
|
||||||
github.com/pion/sdp/v3 v3.0.4/go.mod h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk=
|
|
||||||
github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw=
|
github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw=
|
||||||
github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw=
|
github.com/pion/sdp/v3 v3.0.6/go.mod h1:iiFWFpQO8Fy3S5ldclBkpXqmWy02ns78NOKoLLL0YQw=
|
||||||
github.com/pion/srtp/v2 v2.0.5/go.mod h1:8k6AJlal740mrZ6WYxc4Dg6qDqqhxoRG2GSjlUhDF0A=
|
|
||||||
github.com/pion/srtp/v2 v2.0.17 h1:ECuOk+7uIpY6HUlTb0nXhfvu4REG2hjtC4ronYFCZE4=
|
github.com/pion/srtp/v2 v2.0.17 h1:ECuOk+7uIpY6HUlTb0nXhfvu4REG2hjtC4ronYFCZE4=
|
||||||
github.com/pion/srtp/v2 v2.0.17/go.mod h1:y5WSHcJY4YfNB/5r7ca5YjHeIr1H3LM1rKArGGs8jMc=
|
github.com/pion/srtp/v2 v2.0.17/go.mod h1:y5WSHcJY4YfNB/5r7ca5YjHeIr1H3LM1rKArGGs8jMc=
|
||||||
github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA=
|
|
||||||
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
|
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
|
||||||
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
|
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
|
||||||
github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A=
|
|
||||||
github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q=
|
|
||||||
github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A=
|
|
||||||
github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40=
|
github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40=
|
||||||
github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI=
|
github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI=
|
||||||
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
|
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
|
||||||
github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc=
|
github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc=
|
||||||
github.com/pion/transport/v2 v2.2.3 h1:XcOE3/x41HOSKbl1BfyY1TF1dERx7lVvlMCbXU7kfvA=
|
github.com/pion/transport/v2 v2.2.3 h1:XcOE3/x41HOSKbl1BfyY1TF1dERx7lVvlMCbXU7kfvA=
|
||||||
github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
|
github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
|
||||||
github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw=
|
|
||||||
github.com/pion/turn/v2 v2.1.3 h1:pYxTVWG2gpC97opdRc5IGsQ1lJ9O/IlNhkzj7MMrGAA=
|
github.com/pion/turn/v2 v2.1.3 h1:pYxTVWG2gpC97opdRc5IGsQ1lJ9O/IlNhkzj7MMrGAA=
|
||||||
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
|
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
|
||||||
github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M=
|
|
||||||
github.com/pion/webrtc/v3 v3.1.0-beta.3/go.mod h1:I4O6v2pkiXdVmcn7sUhCNwHUAepGU19PVEyR204s1qc=
|
|
||||||
github.com/pion/webrtc/v3 v3.2.20 h1:BQJiXQsJq9LgLp3op7rLy1y8d2WD+LtiS9cpY0uQ22A=
|
github.com/pion/webrtc/v3 v3.2.20 h1:BQJiXQsJq9LgLp3op7rLy1y8d2WD+LtiS9cpY0uQ22A=
|
||||||
github.com/pion/webrtc/v3 v3.2.20/go.mod h1:vVURQTBOG5BpWKOJz3nlr23NfTDeyKVmubRNqzQp+Tg=
|
github.com/pion/webrtc/v3 v3.2.20/go.mod h1:vVURQTBOG5BpWKOJz3nlr23NfTDeyKVmubRNqzQp+Tg=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8=
|
||||||
|
github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
|
||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
@@ -133,19 +98,15 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
|
|||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
gocv.io/x/gocv v0.28.0/go.mod h1:oc6FvfYqfBp99p+yOEzs9tbYF9gOrAQSeL/dyIPefJU=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
|
||||||
golang.org/x/crypto v0.0.0-20210812204632-0ba0e8f03122/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||||
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
@@ -153,16 +114,9 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r
|
|||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
|
||||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
|
||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
@@ -187,10 +141,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|||||||
+24
-15
@@ -5,6 +5,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -51,22 +52,25 @@ func New() *Server {
|
|||||||
func (s *Server) CreateAuthToken(ctx context.Context, request *connect.Request[pb.CreateAuthTokenRequest]) (*connect.Response[pb.AuthToken], error) {
|
func (s *Server) CreateAuthToken(ctx context.Context, request *connect.Request[pb.CreateAuthTokenRequest]) (*connect.Response[pb.AuthToken], error) {
|
||||||
req := request.Msg
|
req := request.Msg
|
||||||
|
|
||||||
|
log.Printf("Creating auth token")
|
||||||
|
defer log.Printf("Done creating auth token")
|
||||||
var id string
|
var id string
|
||||||
switch req.Type.(type) {
|
switch req.Type.(type) {
|
||||||
case *pb.CreateAuthTokenRequest_Camera_:
|
case *pb.CreateAuthTokenRequest_Camera_:
|
||||||
id = req.GetCamera().GetId()
|
id = req.GetCamera().GetId()
|
||||||
s.mu.Lock()
|
|
||||||
thisCamera := &camera{
|
thisCamera := &camera{
|
||||||
id: id,
|
id: id,
|
||||||
}
|
}
|
||||||
home := req.GetHome()
|
home := req.GetHome()
|
||||||
|
s.mu.Lock()
|
||||||
if _, ok := s.camerasByHome[home]; !ok {
|
if _, ok := s.camerasByHome[home]; !ok {
|
||||||
s.camerasByHome[home] = make(map[string]*camera)
|
s.camerasByHome[home] = make(map[string]*camera)
|
||||||
}
|
}
|
||||||
s.camerasByHome[home][id] = thisCamera
|
s.camerasByHome[home][id] = thisCamera
|
||||||
if _, ok := s.sessionsByCamera[id]; !ok {
|
if _, ok := s.sessionsByCamera[id]; ok {
|
||||||
s.sessionsByCamera[id] = make(chan *session, 100)
|
close(s.sessionsByCamera[id])
|
||||||
}
|
}
|
||||||
|
s.sessionsByCamera[id] = make(chan *session, 100)
|
||||||
s.mu.Unlock()
|
s.mu.Unlock()
|
||||||
case *pb.CreateAuthTokenRequest_Client_:
|
case *pb.CreateAuthTokenRequest_Client_:
|
||||||
myUUID, err := uuid.NewV4()
|
myUUID, err := uuid.NewV4()
|
||||||
@@ -113,6 +117,9 @@ func (s *Server) ListCameras(ctx context.Context, request *connect.Request[pb.Li
|
|||||||
// Optionally, wait_for_update can be set to prevent returning until the Camera has seen the
|
// Optionally, wait_for_update can be set to prevent returning until the Camera has seen the
|
||||||
// session request, populated candidates, and returned a session offer.
|
// session request, populated candidates, and returned a session offer.
|
||||||
func (s *Server) CreateSession(ctx context.Context, request *connect.Request[pb.CreateSessionRequest]) (*connect.Response[pb.Session], error) {
|
func (s *Server) CreateSession(ctx context.Context, request *connect.Request[pb.CreateSessionRequest]) (*connect.Response[pb.Session], error) {
|
||||||
|
|
||||||
|
log.Printf("Creating session")
|
||||||
|
defer log.Printf("Done session")
|
||||||
thisSession := request.Msg.Session
|
thisSession := request.Msg.Session
|
||||||
if thisSession == nil {
|
if thisSession == nil {
|
||||||
return nil, status.Errorf(codes.InvalidArgument, "nil session")
|
return nil, status.Errorf(codes.InvalidArgument, "nil session")
|
||||||
@@ -125,8 +132,6 @@ func (s *Server) CreateSession(ctx context.Context, request *connect.Request[pb.
|
|||||||
id := myUUID.String()
|
id := myUUID.String()
|
||||||
thisSession.Id = &pb.Session_Identifier{Id: id}
|
thisSession.Id = &pb.Session_Identifier{Id: id}
|
||||||
cameraID := thisSession.GetCamera().GetId()
|
cameraID := thisSession.GetCamera().GetId()
|
||||||
s.mu.Lock()
|
|
||||||
defer s.mu.Unlock()
|
|
||||||
|
|
||||||
sess := &session{
|
sess := &session{
|
||||||
id: id,
|
id: id,
|
||||||
@@ -135,8 +140,13 @@ func (s *Server) CreateSession(ctx context.Context, request *connect.Request[pb.
|
|||||||
toCamera: make(chan *pb.IceMessage, 100),
|
toCamera: make(chan *pb.IceMessage, 100),
|
||||||
toClient: make(chan *pb.IceMessage, 100),
|
toClient: make(chan *pb.IceMessage, 100),
|
||||||
}
|
}
|
||||||
s.sessionsByCamera[cameraID] <- sess
|
|
||||||
|
s.mu.Lock()
|
||||||
|
ch := s.sessionsByCamera[cameraID]
|
||||||
s.sessionsById[id] = sess
|
s.sessionsById[id] = sess
|
||||||
|
s.mu.Unlock()
|
||||||
|
|
||||||
|
ch <- sess
|
||||||
|
|
||||||
return connect.NewResponse(thisSession), nil
|
return connect.NewResponse(thisSession), nil
|
||||||
}
|
}
|
||||||
@@ -161,6 +171,10 @@ func (s *Server) PopSession(ctx context.Context, request *connect.Request[pb.Pop
|
|||||||
|
|
||||||
sess := <-ch
|
sess := <-ch
|
||||||
|
|
||||||
|
if sess == nil {
|
||||||
|
return nil, status.Errorf(codes.DataLoss, "someone else stole the session")
|
||||||
|
}
|
||||||
|
|
||||||
return connect.NewResponse(&pb.Session{
|
return connect.NewResponse(&pb.Session{
|
||||||
Id: &pb.Session_Identifier{
|
Id: &pb.Session_Identifier{
|
||||||
Id: sess.id,
|
Id: sess.id,
|
||||||
@@ -228,8 +242,10 @@ func (s *Server) cleanup() {
|
|||||||
ticker := time.NewTicker(time.Minute * 5)
|
ticker := time.NewTicker(time.Minute * 5)
|
||||||
for t := range ticker.C {
|
for t := range ticker.C {
|
||||||
func() {
|
func() {
|
||||||
|
log.Printf("Starting cleanup")
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
|
log.Printf("Cleanup locked")
|
||||||
|
|
||||||
// Look for any stale sessions
|
// Look for any stale sessions
|
||||||
staleSessionsByCamera := make(map[string]*session)
|
staleSessionsByCamera := make(map[string]*session)
|
||||||
@@ -245,16 +261,9 @@ func (s *Server) cleanup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.Printf("Removing stale sessions")
|
||||||
|
|
||||||
for camera, lastSession := range staleSessionsByCamera {
|
// TODO: how do we prevent sessions from accumlating if cameras don't pick up on the request?
|
||||||
// Consume from the chanel until we remove all stale sessions
|
|
||||||
for sess := range s.sessionsByCamera[camera] {
|
|
||||||
if sess == lastSession {
|
|
||||||
// We consumed all stale channels; break
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,9 +96,12 @@ message IceMessage {
|
|||||||
oneof type {
|
oneof type {
|
||||||
IceCandidate candidate = 1;
|
IceCandidate candidate = 1;
|
||||||
IceSessionDescription session = 2;
|
IceSessionDescription session = 2;
|
||||||
|
NoMoreCandidates no_more_candidates = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message NoMoreCandidates {}
|
||||||
|
|
||||||
message IceCandidate {
|
message IceCandidate {
|
||||||
// Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#ICECandidateInit
|
// Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#ICECandidateInit
|
||||||
string candidate = 1;
|
string candidate = 1;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ android {
|
|||||||
applicationId "com.example.ui"
|
applicationId "com.example.ui"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
minSdkVersion flutter.minSdkVersion
|
minSdkVersion 21
|
||||||
targetSdkVersion flutter.targetSdkVersion
|
targetSdkVersion flutter.targetSdkVersion
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
|
|||||||
@@ -30,4 +30,6 @@
|
|||||||
android:name="flutterEmbedding"
|
android:name="flutterEmbedding"
|
||||||
android:value="2" />
|
android:value="2" />
|
||||||
</application>
|
</application>
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
+145
-25
@@ -1,22 +1,60 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||||
|
import 'package:grpc/grpc.dart';
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
|
import 'package:ui/gen/signaler_service.pb.dart';
|
||||||
|
import 'package:ui/gen/signaler_service.pbgrpc.dart' as pb;
|
||||||
|
import 'package:fixnum/fixnum.dart';
|
||||||
|
import 'package:ui/session_service.dart';
|
||||||
|
|
||||||
class Call extends StatefulWidget {
|
class Call extends StatefulWidget {
|
||||||
final String host;
|
final pb.SignalerServiceClient client;
|
||||||
const Call({required this.host, super.key});
|
final SessionService sessionService;
|
||||||
|
final pb.Camera_Identifier cameraID;
|
||||||
|
final String home;
|
||||||
|
const Call(this.client, this.sessionService,
|
||||||
|
{required this.cameraID, required this.home, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_CallState createState() => _CallState();
|
CallState createState() => CallState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _CallState extends State<Call> {
|
class CallState extends State<Call> {
|
||||||
Logger logger = Logger();
|
Logger logger = Logger();
|
||||||
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
|
final RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
|
||||||
|
bool _ready = false;
|
||||||
|
String statusLine = "Building...";
|
||||||
|
|
||||||
void _connect(BuildContext context) async {}
|
@override
|
||||||
|
initState() {
|
||||||
|
super.initState();
|
||||||
|
_connect();
|
||||||
|
}
|
||||||
|
|
||||||
Future<Session> _createSesson() async {
|
_connect() async {
|
||||||
|
_ready = false;
|
||||||
|
logger.i("Init remote renderer");
|
||||||
|
await _remoteRenderer.initialize();
|
||||||
|
logger.i("Creating session");
|
||||||
|
await _createSesson();
|
||||||
|
}
|
||||||
|
|
||||||
|
_createSesson() async {
|
||||||
|
var callOptions = CallOptions(metadata: {
|
||||||
|
'Authorization': await widget.sessionService.getAuthToken(widget.home)
|
||||||
|
});
|
||||||
|
|
||||||
|
var cancelCreate = Completer();
|
||||||
|
|
||||||
|
var clientSession = await widget.client.createSession(
|
||||||
|
pb.CreateSessionRequest(
|
||||||
|
session: pb.Session(
|
||||||
|
camera: widget.cameraID,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
options: callOptions);
|
||||||
RTCPeerConnection peerConnection = await createPeerConnection({
|
RTCPeerConnection peerConnection = await createPeerConnection({
|
||||||
// Ice servers; just use the Google one for now
|
// Ice servers; just use the Google one for now
|
||||||
'iceServers': [
|
'iceServers': [
|
||||||
@@ -28,47 +66,129 @@ class _CallState extends State<Call> {
|
|||||||
|
|
||||||
peerConnection.onAddStream = (stream) {
|
peerConnection.onAddStream = (stream) {
|
||||||
// Stream has been added; connect it to our renderer
|
// Stream has been added; connect it to our renderer
|
||||||
|
logger.i("Got stream from remote; connecting it");
|
||||||
_remoteRenderer.srcObject = stream;
|
_remoteRenderer.srcObject = stream;
|
||||||
|
_ready = true;
|
||||||
|
setState(() {});
|
||||||
};
|
};
|
||||||
|
|
||||||
peerConnection.onIceCandidate = (candidate) {
|
peerConnection.onIceCandidate = (candidate) async {
|
||||||
if (candidate.candidate == null) {
|
if (candidate.candidate == null) {
|
||||||
logger.i("Out of candidates");
|
await widget.client.createIceMessage(
|
||||||
|
CreateIceMessageRequest(
|
||||||
|
sessionIdentifier: clientSession.id,
|
||||||
|
iceMessage: IceMessage(
|
||||||
|
noMoreCandidates: NoMoreCandidates(),
|
||||||
|
)),
|
||||||
|
options: callOptions);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send the candidate on to the signaling server
|
await widget.client.createIceMessage(
|
||||||
|
pb.CreateIceMessageRequest(
|
||||||
|
sessionIdentifier: clientSession.id,
|
||||||
|
iceMessage: pb.IceMessage(
|
||||||
|
candidate: pb.IceCandidate(
|
||||||
|
candidate: candidate.candidate,
|
||||||
|
sdpMid: candidate.sdpMid,
|
||||||
|
sdpLineIndex: candidate.sdpMLineIndex,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
options: callOptions);
|
||||||
};
|
};
|
||||||
|
|
||||||
peerConnection.onIceConnectionState = (state) {};
|
peerConnection.onIceConnectionState = (state) {
|
||||||
|
statusLine = "Ice state now $state";
|
||||||
|
setState(() {});
|
||||||
|
logger.i("Ice state now $state");
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case RTCIceConnectionState.RTCIceConnectionStateClosed:
|
||||||
|
case RTCIceConnectionState.RTCIceConnectionStateDisconnected:
|
||||||
|
case RTCIceConnectionState.RTCIceConnectionStateFailed:
|
||||||
|
cancelCreate.complete(CallCancelled());
|
||||||
|
_connect();
|
||||||
|
default:
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
peerConnection.onIceGatheringState = (state) async {
|
||||||
|
logger.i("ICE gathering state $state");
|
||||||
|
if (state == RTCIceGatheringState.RTCIceGatheringStateComplete) {
|
||||||
|
await widget.client.createIceMessage(
|
||||||
|
CreateIceMessageRequest(
|
||||||
|
sessionIdentifier: clientSession.id,
|
||||||
|
iceMessage: IceMessage(
|
||||||
|
noMoreCandidates: NoMoreCandidates(),
|
||||||
|
)),
|
||||||
|
options: callOptions);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
peerConnection.onRemoveStream = (stream) {};
|
peerConnection.onRemoveStream = (stream) {};
|
||||||
|
|
||||||
peerConnection.onDataChannel = (channel) {};
|
peerConnection.onDataChannel = (channel) {};
|
||||||
|
|
||||||
// Get list of candidates from signaling server
|
|
||||||
for (final remoteCandidate in []) {
|
|
||||||
peerConnection.addCandidate(remoteCandidate);
|
|
||||||
}
|
|
||||||
// This will find the intersection of my candidates and the remote,
|
// This will find the intersection of my candidates and the remote,
|
||||||
// then propose one to use
|
// then propose one to use
|
||||||
var offer = peerConnection.createOffer();
|
var offer = await peerConnection.createOffer();
|
||||||
|
await peerConnection.setLocalDescription(offer);
|
||||||
// Send offer through signaling server
|
// Send offer through signaling server
|
||||||
logger.i("Offer is $offer");
|
logger.i("Offer is $offer");
|
||||||
|
await widget.client.createIceMessage(
|
||||||
|
pb.CreateIceMessageRequest(
|
||||||
|
sessionIdentifier: clientSession.id,
|
||||||
|
iceMessage: pb.IceMessage(
|
||||||
|
session: pb.IceSessionDescription(
|
||||||
|
sdp: offer.sdp,
|
||||||
|
sdpType: Int64(1), // offer
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
options: callOptions);
|
||||||
|
|
||||||
var session = Session(peerConnection);
|
// Get candidates from remote
|
||||||
return session;
|
while (true) {
|
||||||
|
var someResponse = await Future.any([
|
||||||
|
widget.client.popIceMessage(
|
||||||
|
pb.PopIceMessageRequest(sessionIdentifier: clientSession.id),
|
||||||
|
options: callOptions),
|
||||||
|
cancelCreate.future,
|
||||||
|
]);
|
||||||
|
if (someResponse is CallCancelled) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var resp = someResponse as pb.IceMessage;
|
||||||
|
if (resp.hasCandidate()) {
|
||||||
|
await peerConnection.addCandidate(RTCIceCandidate(
|
||||||
|
resp.candidate.candidate,
|
||||||
|
resp.candidate.sdpMid,
|
||||||
|
resp.candidate.sdpLineIndex));
|
||||||
|
} else if (resp.hasNoMoreCandidates()) {
|
||||||
|
logger.i("No more candidates from remote");
|
||||||
|
} else if (resp.hasSession()) {
|
||||||
|
var session = resp.session;
|
||||||
|
await peerConnection
|
||||||
|
.setRemoteDescription(RTCSessionDescription(session.sdp, "answer"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return RTCVideoView(_remoteRenderer);
|
return Column(children: [
|
||||||
|
Text(widget.cameraID.id),
|
||||||
|
Text(statusLine),
|
||||||
|
SizedBox(
|
||||||
|
height: 480,
|
||||||
|
child: _ready
|
||||||
|
? RTCVideoView(_remoteRenderer)
|
||||||
|
: const Text("Loading...")),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Session {
|
class CallCancelled {}
|
||||||
RTCPeerConnection peerConnection;
|
|
||||||
|
|
||||||
Session(this.peerConnection);
|
|
||||||
List<RTCIceCandidate> remoteCandidates = [];
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: signaler_service.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: signaler_service.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
|
import 'dart:async' as $async;
|
||||||
|
import 'dart:core' as $core;
|
||||||
|
|
||||||
|
import 'package:grpc/service_api.dart' as $grpc;
|
||||||
|
import 'package:protobuf/protobuf.dart' as $pb;
|
||||||
|
|
||||||
|
import 'signaler_service.pb.dart' as $0;
|
||||||
|
|
||||||
|
export 'signaler_service.pb.dart';
|
||||||
|
|
||||||
|
@$pb.GrpcServiceName('signaler.SignalerService')
|
||||||
|
class SignalerServiceClient extends $grpc.Client {
|
||||||
|
static final _$createAuthToken = $grpc.ClientMethod<$0.CreateAuthTokenRequest, $0.AuthToken>(
|
||||||
|
'/signaler.SignalerService/CreateAuthToken',
|
||||||
|
($0.CreateAuthTokenRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.AuthToken.fromBuffer(value));
|
||||||
|
static final _$listCameras = $grpc.ClientMethod<$0.ListCamerasRequest, $0.ListCamerasResponse>(
|
||||||
|
'/signaler.SignalerService/ListCameras',
|
||||||
|
($0.ListCamerasRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.ListCamerasResponse.fromBuffer(value));
|
||||||
|
static final _$createSession = $grpc.ClientMethod<$0.CreateSessionRequest, $0.Session>(
|
||||||
|
'/signaler.SignalerService/CreateSession',
|
||||||
|
($0.CreateSessionRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.Session.fromBuffer(value));
|
||||||
|
static final _$popSession = $grpc.ClientMethod<$0.PopSessionRequest, $0.Session>(
|
||||||
|
'/signaler.SignalerService/PopSession',
|
||||||
|
($0.PopSessionRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.Session.fromBuffer(value));
|
||||||
|
static final _$createIceMessage = $grpc.ClientMethod<$0.CreateIceMessageRequest, $0.IceMessage>(
|
||||||
|
'/signaler.SignalerService/CreateIceMessage',
|
||||||
|
($0.CreateIceMessageRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.IceMessage.fromBuffer(value));
|
||||||
|
static final _$popIceMessage = $grpc.ClientMethod<$0.PopIceMessageRequest, $0.IceMessage>(
|
||||||
|
'/signaler.SignalerService/PopIceMessage',
|
||||||
|
($0.PopIceMessageRequest value) => value.writeToBuffer(),
|
||||||
|
($core.List<$core.int> value) => $0.IceMessage.fromBuffer(value));
|
||||||
|
|
||||||
|
SignalerServiceClient($grpc.ClientChannel channel,
|
||||||
|
{$grpc.CallOptions? options,
|
||||||
|
$core.Iterable<$grpc.ClientInterceptor>? interceptors})
|
||||||
|
: super(channel, options: options,
|
||||||
|
interceptors: interceptors);
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.AuthToken> createAuthToken($0.CreateAuthTokenRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$createAuthToken, request, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.ListCamerasResponse> listCameras($0.ListCamerasRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$listCameras, request, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.Session> createSession($0.CreateSessionRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$createSession, request, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.Session> popSession($0.PopSessionRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$popSession, request, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.IceMessage> createIceMessage($0.CreateIceMessageRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$createIceMessage, request, options: options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grpc.ResponseFuture<$0.IceMessage> popIceMessage($0.PopIceMessageRequest request, {$grpc.CallOptions? options}) {
|
||||||
|
return $createUnaryCall(_$popIceMessage, request, options: options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@$pb.GrpcServiceName('signaler.SignalerService')
|
||||||
|
abstract class SignalerServiceBase extends $grpc.Service {
|
||||||
|
$core.String get $name => 'signaler.SignalerService';
|
||||||
|
|
||||||
|
SignalerServiceBase() {
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.CreateAuthTokenRequest, $0.AuthToken>(
|
||||||
|
'CreateAuthToken',
|
||||||
|
createAuthToken_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.CreateAuthTokenRequest.fromBuffer(value),
|
||||||
|
($0.AuthToken value) => value.writeToBuffer()));
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.ListCamerasRequest, $0.ListCamerasResponse>(
|
||||||
|
'ListCameras',
|
||||||
|
listCameras_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.ListCamerasRequest.fromBuffer(value),
|
||||||
|
($0.ListCamerasResponse value) => value.writeToBuffer()));
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.CreateSessionRequest, $0.Session>(
|
||||||
|
'CreateSession',
|
||||||
|
createSession_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.CreateSessionRequest.fromBuffer(value),
|
||||||
|
($0.Session value) => value.writeToBuffer()));
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.PopSessionRequest, $0.Session>(
|
||||||
|
'PopSession',
|
||||||
|
popSession_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.PopSessionRequest.fromBuffer(value),
|
||||||
|
($0.Session value) => value.writeToBuffer()));
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.CreateIceMessageRequest, $0.IceMessage>(
|
||||||
|
'CreateIceMessage',
|
||||||
|
createIceMessage_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.CreateIceMessageRequest.fromBuffer(value),
|
||||||
|
($0.IceMessage value) => value.writeToBuffer()));
|
||||||
|
$addMethod($grpc.ServiceMethod<$0.PopIceMessageRequest, $0.IceMessage>(
|
||||||
|
'PopIceMessage',
|
||||||
|
popIceMessage_Pre,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
($core.List<$core.int> value) => $0.PopIceMessageRequest.fromBuffer(value),
|
||||||
|
($0.IceMessage value) => value.writeToBuffer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.AuthToken> createAuthToken_Pre($grpc.ServiceCall call, $async.Future<$0.CreateAuthTokenRequest> request) async {
|
||||||
|
return createAuthToken(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.ListCamerasResponse> listCameras_Pre($grpc.ServiceCall call, $async.Future<$0.ListCamerasRequest> request) async {
|
||||||
|
return listCameras(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.Session> createSession_Pre($grpc.ServiceCall call, $async.Future<$0.CreateSessionRequest> request) async {
|
||||||
|
return createSession(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.Session> popSession_Pre($grpc.ServiceCall call, $async.Future<$0.PopSessionRequest> request) async {
|
||||||
|
return popSession(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.IceMessage> createIceMessage_Pre($grpc.ServiceCall call, $async.Future<$0.CreateIceMessageRequest> request) async {
|
||||||
|
return createIceMessage(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.IceMessage> popIceMessage_Pre($grpc.ServiceCall call, $async.Future<$0.PopIceMessageRequest> request) async {
|
||||||
|
return popIceMessage(call, await request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$async.Future<$0.AuthToken> createAuthToken($grpc.ServiceCall call, $0.CreateAuthTokenRequest request);
|
||||||
|
$async.Future<$0.ListCamerasResponse> listCameras($grpc.ServiceCall call, $0.ListCamerasRequest request);
|
||||||
|
$async.Future<$0.Session> createSession($grpc.ServiceCall call, $0.CreateSessionRequest request);
|
||||||
|
$async.Future<$0.Session> popSession($grpc.ServiceCall call, $0.PopSessionRequest request);
|
||||||
|
$async.Future<$0.IceMessage> createIceMessage($grpc.ServiceCall call, $0.CreateIceMessageRequest request);
|
||||||
|
$async.Future<$0.IceMessage> popIceMessage($grpc.ServiceCall call, $0.PopIceMessageRequest request);
|
||||||
|
}
|
||||||
@@ -0,0 +1,286 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: signaler_service.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
|
import 'dart:convert' as $convert;
|
||||||
|
import 'dart:core' as $core;
|
||||||
|
import 'dart:typed_data' as $typed_data;
|
||||||
|
|
||||||
|
@$core.Deprecated('Use createAuthTokenRequestDescriptor instead')
|
||||||
|
const CreateAuthTokenRequest$json = {
|
||||||
|
'1': 'CreateAuthTokenRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'home', '3': 1, '4': 1, '5': 9, '10': 'home'},
|
||||||
|
{'1': 'camera', '3': 2, '4': 1, '5': 11, '6': '.signaler.CreateAuthTokenRequest.Camera', '9': 0, '10': 'camera'},
|
||||||
|
{'1': 'client', '3': 3, '4': 1, '5': 11, '6': '.signaler.CreateAuthTokenRequest.Client', '9': 0, '10': 'client'},
|
||||||
|
],
|
||||||
|
'3': [CreateAuthTokenRequest_Camera$json, CreateAuthTokenRequest_Client$json],
|
||||||
|
'8': [
|
||||||
|
{'1': 'type'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
@$core.Deprecated('Use createAuthTokenRequestDescriptor instead')
|
||||||
|
const CreateAuthTokenRequest_Camera$json = {
|
||||||
|
'1': 'Camera',
|
||||||
|
'2': [
|
||||||
|
{'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
@$core.Deprecated('Use createAuthTokenRequestDescriptor instead')
|
||||||
|
const CreateAuthTokenRequest_Client$json = {
|
||||||
|
'1': 'Client',
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `CreateAuthTokenRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List createAuthTokenRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChZDcmVhdGVBdXRoVG9rZW5SZXF1ZXN0EhIKBGhvbWUYASABKAlSBGhvbWUSQQoGY2FtZXJhGA'
|
||||||
|
'IgASgLMicuc2lnbmFsZXIuQ3JlYXRlQXV0aFRva2VuUmVxdWVzdC5DYW1lcmFIAFIGY2FtZXJh'
|
||||||
|
'EkEKBmNsaWVudBgDIAEoCzInLnNpZ25hbGVyLkNyZWF0ZUF1dGhUb2tlblJlcXVlc3QuQ2xpZW'
|
||||||
|
'50SABSBmNsaWVudBoYCgZDYW1lcmESDgoCaWQYASABKAlSAmlkGggKBkNsaWVudEIGCgR0eXBl');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use listCamerasRequestDescriptor instead')
|
||||||
|
const ListCamerasRequest$json = {
|
||||||
|
'1': 'ListCamerasRequest',
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `ListCamerasRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List listCamerasRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChJMaXN0Q2FtZXJhc1JlcXVlc3Q=');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use listCamerasResponseDescriptor instead')
|
||||||
|
const ListCamerasResponse$json = {
|
||||||
|
'1': 'ListCamerasResponse',
|
||||||
|
'2': [
|
||||||
|
{'1': 'cameras', '3': 1, '4': 3, '5': 11, '6': '.signaler.Camera', '10': 'cameras'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `ListCamerasResponse`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List listCamerasResponseDescriptor = $convert.base64Decode(
|
||||||
|
'ChNMaXN0Q2FtZXJhc1Jlc3BvbnNlEioKB2NhbWVyYXMYASADKAsyEC5zaWduYWxlci5DYW1lcm'
|
||||||
|
'FSB2NhbWVyYXM=');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use createSessionRequestDescriptor instead')
|
||||||
|
const CreateSessionRequest$json = {
|
||||||
|
'1': 'CreateSessionRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'session', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session', '10': 'session'},
|
||||||
|
{'1': 'wait_for_update', '3': 2, '4': 1, '5': 8, '10': 'waitForUpdate'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `CreateSessionRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List createSessionRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChRDcmVhdGVTZXNzaW9uUmVxdWVzdBIrCgdzZXNzaW9uGAEgASgLMhEuc2lnbmFsZXIuU2Vzc2'
|
||||||
|
'lvblIHc2Vzc2lvbhImCg93YWl0X2Zvcl91cGRhdGUYAiABKAhSDXdhaXRGb3JVcGRhdGU=');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use popSessionRequestDescriptor instead')
|
||||||
|
const PopSessionRequest$json = {
|
||||||
|
'1': 'PopSessionRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'session', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session', '10': 'session'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `PopSessionRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List popSessionRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChFQb3BTZXNzaW9uUmVxdWVzdBIrCgdzZXNzaW9uGAEgASgLMhEuc2lnbmFsZXIuU2Vzc2lvbl'
|
||||||
|
'IHc2Vzc2lvbg==');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use updateSessionRequestDescriptor instead')
|
||||||
|
const UpdateSessionRequest$json = {
|
||||||
|
'1': 'UpdateSessionRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'session', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session', '10': 'session'},
|
||||||
|
{'1': 'wait_for_update', '3': 2, '4': 1, '5': 8, '10': 'waitForUpdate'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `UpdateSessionRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List updateSessionRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChRVcGRhdGVTZXNzaW9uUmVxdWVzdBIrCgdzZXNzaW9uGAEgASgLMhEuc2lnbmFsZXIuU2Vzc2'
|
||||||
|
'lvblIHc2Vzc2lvbhImCg93YWl0X2Zvcl91cGRhdGUYAiABKAhSDXdhaXRGb3JVcGRhdGU=');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use listSessionsRequestDescriptor instead')
|
||||||
|
const ListSessionsRequest$json = {
|
||||||
|
'1': 'ListSessionsRequest',
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `ListSessionsRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List listSessionsRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChNMaXN0U2Vzc2lvbnNSZXF1ZXN0');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use listSessionsResponseDescriptor instead')
|
||||||
|
const ListSessionsResponse$json = {
|
||||||
|
'1': 'ListSessionsResponse',
|
||||||
|
'2': [
|
||||||
|
{'1': 'sessions', '3': 1, '4': 3, '5': 11, '6': '.signaler.Session', '10': 'sessions'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `ListSessionsResponse`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List listSessionsResponseDescriptor = $convert.base64Decode(
|
||||||
|
'ChRMaXN0U2Vzc2lvbnNSZXNwb25zZRItCghzZXNzaW9ucxgBIAMoCzIRLnNpZ25hbGVyLlNlc3'
|
||||||
|
'Npb25SCHNlc3Npb25z');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use createIceMessageRequestDescriptor instead')
|
||||||
|
const CreateIceMessageRequest$json = {
|
||||||
|
'1': 'CreateIceMessageRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'},
|
||||||
|
{'1': 'ice_message', '3': 2, '4': 1, '5': 11, '6': '.signaler.IceMessage', '10': 'iceMessage'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `CreateIceMessageRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List createIceMessageRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChdDcmVhdGVJY2VNZXNzYWdlUmVxdWVzdBJLChJzZXNzaW9uX2lkZW50aWZpZXIYASABKAsyHC'
|
||||||
|
'5zaWduYWxlci5TZXNzaW9uLklkZW50aWZpZXJSEXNlc3Npb25JZGVudGlmaWVyEjUKC2ljZV9t'
|
||||||
|
'ZXNzYWdlGAIgASgLMhQuc2lnbmFsZXIuSWNlTWVzc2FnZVIKaWNlTWVzc2FnZQ==');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use popIceMessageRequestDescriptor instead')
|
||||||
|
const PopIceMessageRequest$json = {
|
||||||
|
'1': 'PopIceMessageRequest',
|
||||||
|
'2': [
|
||||||
|
{'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `PopIceMessageRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List popIceMessageRequestDescriptor = $convert.base64Decode(
|
||||||
|
'ChRQb3BJY2VNZXNzYWdlUmVxdWVzdBJLChJzZXNzaW9uX2lkZW50aWZpZXIYASABKAsyHC5zaW'
|
||||||
|
'duYWxlci5TZXNzaW9uLklkZW50aWZpZXJSEXNlc3Npb25JZGVudGlmaWVy');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use cameraDescriptor instead')
|
||||||
|
const Camera$json = {
|
||||||
|
'1': 'Camera',
|
||||||
|
'2': [
|
||||||
|
{'1': 'identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Camera.Identifier', '10': 'identifier'},
|
||||||
|
],
|
||||||
|
'3': [Camera_Identifier$json],
|
||||||
|
};
|
||||||
|
|
||||||
|
@$core.Deprecated('Use cameraDescriptor instead')
|
||||||
|
const Camera_Identifier$json = {
|
||||||
|
'1': 'Identifier',
|
||||||
|
'2': [
|
||||||
|
{'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `Camera`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List cameraDescriptor = $convert.base64Decode(
|
||||||
|
'CgZDYW1lcmESOwoKaWRlbnRpZmllchgBIAEoCzIbLnNpZ25hbGVyLkNhbWVyYS5JZGVudGlmaW'
|
||||||
|
'VyUgppZGVudGlmaWVyGhwKCklkZW50aWZpZXISDgoCaWQYASABKAlSAmlk');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use iceMessageDescriptor instead')
|
||||||
|
const IceMessage$json = {
|
||||||
|
'1': 'IceMessage',
|
||||||
|
'2': [
|
||||||
|
{'1': 'candidate', '3': 1, '4': 1, '5': 11, '6': '.signaler.IceCandidate', '9': 0, '10': 'candidate'},
|
||||||
|
{'1': 'session', '3': 2, '4': 1, '5': 11, '6': '.signaler.IceSessionDescription', '9': 0, '10': 'session'},
|
||||||
|
{'1': 'no_more_candidates', '3': 3, '4': 1, '5': 11, '6': '.signaler.NoMoreCandidates', '9': 0, '10': 'noMoreCandidates'},
|
||||||
|
],
|
||||||
|
'8': [
|
||||||
|
{'1': 'type'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `IceMessage`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List iceMessageDescriptor = $convert.base64Decode(
|
||||||
|
'CgpJY2VNZXNzYWdlEjYKCWNhbmRpZGF0ZRgBIAEoCzIWLnNpZ25hbGVyLkljZUNhbmRpZGF0ZU'
|
||||||
|
'gAUgljYW5kaWRhdGUSOwoHc2Vzc2lvbhgCIAEoCzIfLnNpZ25hbGVyLkljZVNlc3Npb25EZXNj'
|
||||||
|
'cmlwdGlvbkgAUgdzZXNzaW9uEkoKEm5vX21vcmVfY2FuZGlkYXRlcxgDIAEoCzIaLnNpZ25hbG'
|
||||||
|
'VyLk5vTW9yZUNhbmRpZGF0ZXNIAFIQbm9Nb3JlQ2FuZGlkYXRlc0IGCgR0eXBl');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use noMoreCandidatesDescriptor instead')
|
||||||
|
const NoMoreCandidates$json = {
|
||||||
|
'1': 'NoMoreCandidates',
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `NoMoreCandidates`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List noMoreCandidatesDescriptor = $convert.base64Decode(
|
||||||
|
'ChBOb01vcmVDYW5kaWRhdGVz');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use iceCandidateDescriptor instead')
|
||||||
|
const IceCandidate$json = {
|
||||||
|
'1': 'IceCandidate',
|
||||||
|
'2': [
|
||||||
|
{'1': 'candidate', '3': 1, '4': 1, '5': 9, '10': 'candidate'},
|
||||||
|
{'1': 'sdp_mid', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'sdpMid', '17': true},
|
||||||
|
{'1': 'sdp_line_index', '3': 3, '4': 1, '5': 5, '9': 1, '10': 'sdpLineIndex', '17': true},
|
||||||
|
{'1': 'username_fragment', '3': 4, '4': 1, '5': 9, '9': 2, '10': 'usernameFragment', '17': true},
|
||||||
|
],
|
||||||
|
'8': [
|
||||||
|
{'1': '_sdp_mid'},
|
||||||
|
{'1': '_sdp_line_index'},
|
||||||
|
{'1': '_username_fragment'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `IceCandidate`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List iceCandidateDescriptor = $convert.base64Decode(
|
||||||
|
'CgxJY2VDYW5kaWRhdGUSHAoJY2FuZGlkYXRlGAEgASgJUgljYW5kaWRhdGUSHAoHc2RwX21pZB'
|
||||||
|
'gCIAEoCUgAUgZzZHBNaWSIAQESKQoOc2RwX2xpbmVfaW5kZXgYAyABKAVIAVIMc2RwTGluZUlu'
|
||||||
|
'ZGV4iAEBEjAKEXVzZXJuYW1lX2ZyYWdtZW50GAQgASgJSAJSEHVzZXJuYW1lRnJhZ21lbnSIAQ'
|
||||||
|
'FCCgoIX3NkcF9taWRCEQoPX3NkcF9saW5lX2luZGV4QhQKEl91c2VybmFtZV9mcmFnbWVudA==');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use iceSessionDescriptionDescriptor instead')
|
||||||
|
const IceSessionDescription$json = {
|
||||||
|
'1': 'IceSessionDescription',
|
||||||
|
'2': [
|
||||||
|
{'1': 'sdp_type', '3': 1, '4': 1, '5': 3, '10': 'sdpType'},
|
||||||
|
{'1': 'sdp', '3': 2, '4': 1, '5': 9, '10': 'sdp'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `IceSessionDescription`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List iceSessionDescriptionDescriptor = $convert.base64Decode(
|
||||||
|
'ChVJY2VTZXNzaW9uRGVzY3JpcHRpb24SGQoIc2RwX3R5cGUYASABKANSB3NkcFR5cGUSEAoDc2'
|
||||||
|
'RwGAIgASgJUgNzZHA=');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use sessionDescriptor instead')
|
||||||
|
const Session$json = {
|
||||||
|
'1': 'Session',
|
||||||
|
'2': [
|
||||||
|
{'1': 'id', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'id'},
|
||||||
|
{'1': 'camera', '3': 2, '4': 1, '5': 11, '6': '.signaler.Camera.Identifier', '10': 'camera'},
|
||||||
|
],
|
||||||
|
'3': [Session_Identifier$json],
|
||||||
|
};
|
||||||
|
|
||||||
|
@$core.Deprecated('Use sessionDescriptor instead')
|
||||||
|
const Session_Identifier$json = {
|
||||||
|
'1': 'Identifier',
|
||||||
|
'2': [
|
||||||
|
{'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `Session`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List sessionDescriptor = $convert.base64Decode(
|
||||||
|
'CgdTZXNzaW9uEiwKAmlkGAEgASgLMhwuc2lnbmFsZXIuU2Vzc2lvbi5JZGVudGlmaWVyUgJpZB'
|
||||||
|
'IzCgZjYW1lcmEYAiABKAsyGy5zaWduYWxlci5DYW1lcmEuSWRlbnRpZmllclIGY2FtZXJhGhwK'
|
||||||
|
'CklkZW50aWZpZXISDgoCaWQYASABKAlSAmlk');
|
||||||
|
|
||||||
|
@$core.Deprecated('Use authTokenDescriptor instead')
|
||||||
|
const AuthToken$json = {
|
||||||
|
'1': 'AuthToken',
|
||||||
|
'2': [
|
||||||
|
{'1': 'token', '3': 1, '4': 1, '5': 9, '10': 'token'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `AuthToken`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List authTokenDescriptor = $convert.base64Decode(
|
||||||
|
'CglBdXRoVG9rZW4SFAoFdG9rZW4YASABKAlSBXRva2Vu');
|
||||||
|
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: token/token.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
|
import 'dart:core' as $core;
|
||||||
|
|
||||||
|
import 'package:protobuf/protobuf.dart' as $pb;
|
||||||
|
|
||||||
|
class AuthToken extends $pb.GeneratedMessage {
|
||||||
|
factory AuthToken({
|
||||||
|
$core.String? uid,
|
||||||
|
$core.String? home,
|
||||||
|
}) {
|
||||||
|
final $result = create();
|
||||||
|
if (uid != null) {
|
||||||
|
$result.uid = uid;
|
||||||
|
}
|
||||||
|
if (home != null) {
|
||||||
|
$result.home = home;
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
AuthToken._() : super();
|
||||||
|
factory AuthToken.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||||
|
factory AuthToken.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||||
|
|
||||||
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AuthToken', package: const $pb.PackageName(_omitMessageNames ? '' : 'token'), createEmptyInstance: create)
|
||||||
|
..aOS(1, _omitFieldNames ? '' : 'uid')
|
||||||
|
..aOS(2, _omitFieldNames ? '' : 'home')
|
||||||
|
..hasRequiredFields = false
|
||||||
|
;
|
||||||
|
|
||||||
|
@$core.Deprecated(
|
||||||
|
'Using this can add significant overhead to your binary. '
|
||||||
|
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||||
|
'Will be removed in next major version')
|
||||||
|
AuthToken clone() => AuthToken()..mergeFromMessage(this);
|
||||||
|
@$core.Deprecated(
|
||||||
|
'Using this can add significant overhead to your binary. '
|
||||||
|
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||||
|
'Will be removed in next major version')
|
||||||
|
AuthToken copyWith(void Function(AuthToken) updates) => super.copyWith((message) => updates(message as AuthToken)) as AuthToken;
|
||||||
|
|
||||||
|
$pb.BuilderInfo get info_ => _i;
|
||||||
|
|
||||||
|
@$core.pragma('dart2js:noInline')
|
||||||
|
static AuthToken create() => AuthToken._();
|
||||||
|
AuthToken createEmptyInstance() => create();
|
||||||
|
static $pb.PbList<AuthToken> createRepeated() => $pb.PbList<AuthToken>();
|
||||||
|
@$core.pragma('dart2js:noInline')
|
||||||
|
static AuthToken getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AuthToken>(create);
|
||||||
|
static AuthToken? _defaultInstance;
|
||||||
|
|
||||||
|
@$pb.TagNumber(1)
|
||||||
|
$core.String get uid => $_getSZ(0);
|
||||||
|
@$pb.TagNumber(1)
|
||||||
|
set uid($core.String v) { $_setString(0, v); }
|
||||||
|
@$pb.TagNumber(1)
|
||||||
|
$core.bool hasUid() => $_has(0);
|
||||||
|
@$pb.TagNumber(1)
|
||||||
|
void clearUid() => clearField(1);
|
||||||
|
|
||||||
|
@$pb.TagNumber(2)
|
||||||
|
$core.String get home => $_getSZ(1);
|
||||||
|
@$pb.TagNumber(2)
|
||||||
|
set home($core.String v) { $_setString(1, v); }
|
||||||
|
@$pb.TagNumber(2)
|
||||||
|
$core.bool hasHome() => $_has(1);
|
||||||
|
@$pb.TagNumber(2)
|
||||||
|
void clearHome() => clearField(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
|
||||||
|
const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: token/token.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// Generated code. Do not modify.
|
||||||
|
// source: token/token.proto
|
||||||
|
//
|
||||||
|
// @dart = 2.12
|
||||||
|
|
||||||
|
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
||||||
|
// ignore_for_file: constant_identifier_names, library_prefixes
|
||||||
|
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
|
||||||
|
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
|
||||||
|
|
||||||
|
import 'dart:convert' as $convert;
|
||||||
|
import 'dart:core' as $core;
|
||||||
|
import 'dart:typed_data' as $typed_data;
|
||||||
|
|
||||||
|
@$core.Deprecated('Use authTokenDescriptor instead')
|
||||||
|
const AuthToken$json = {
|
||||||
|
'1': 'AuthToken',
|
||||||
|
'2': [
|
||||||
|
{'1': 'uid', '3': 1, '4': 1, '5': 9, '10': 'uid'},
|
||||||
|
{'1': 'home', '3': 2, '4': 1, '5': 9, '10': 'home'},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Descriptor for `AuthToken`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
|
final $typed_data.Uint8List authTokenDescriptor = $convert.base64Decode(
|
||||||
|
'CglBdXRoVG9rZW4SEAoDdWlkGAEgASgJUgN1aWQSEgoEaG9tZRgCIAEoCVIEaG9tZQ==');
|
||||||
|
|
||||||
+68
-23
@@ -1,12 +1,30 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
//import 'package:grpc/grpc_web.dart';
|
||||||
|
import 'package:grpc/grpc.dart';
|
||||||
|
import 'package:logger/logger.dart';
|
||||||
import 'package:ui/call.dart';
|
import 'package:ui/call.dart';
|
||||||
|
import 'package:ui/gen/signaler_service.pbgrpc.dart';
|
||||||
|
import 'package:ui/session_service.dart';
|
||||||
|
|
||||||
void main() {
|
void main() async {
|
||||||
runApp(const MyApp());
|
Logger logger = Logger();
|
||||||
|
logger.i("Establishing connection...");
|
||||||
|
final channel = ClientChannel(
|
||||||
|
'192.168.0.65',
|
||||||
|
port: 8080,
|
||||||
|
options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
|
||||||
|
channelShutdownHandler: () {
|
||||||
|
logger.e("Channel shutdown unexpectedly");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
final stub = SignalerServiceClient(channel);
|
||||||
|
runApp(MyApp(stub, SessionService(stub)));
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
const MyApp({super.key});
|
final SignalerServiceClient client;
|
||||||
|
final SessionService sessionService;
|
||||||
|
const MyApp(this.client, this.sessionService, {super.key});
|
||||||
|
|
||||||
// This widget is the root of your application.
|
// This widget is the root of your application.
|
||||||
@override
|
@override
|
||||||
@@ -32,13 +50,22 @@ class MyApp extends StatelessWidget {
|
|||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
),
|
),
|
||||||
home: const MyHomePage(title: 'Flutter Demo Home Page'),
|
home: MyHomePage(
|
||||||
|
client,
|
||||||
|
sessionService,
|
||||||
|
title: 'Home Sensors',
|
||||||
|
home: "home1234",
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyHomePage extends StatefulWidget {
|
class MyHomePage extends StatefulWidget {
|
||||||
const MyHomePage({super.key, required this.title});
|
final SignalerServiceClient client;
|
||||||
|
final SessionService sessionService;
|
||||||
|
final String home;
|
||||||
|
const MyHomePage(this.client, this.sessionService,
|
||||||
|
{super.key, required this.title, required this.home});
|
||||||
|
|
||||||
// This widget is the home page of your application. It is stateful, meaning
|
// This widget is the home page of your application. It is stateful, meaning
|
||||||
// that it has a State object (defined below) that contains fields that affect
|
// that it has a State object (defined below) that contains fields that affect
|
||||||
@@ -56,17 +83,38 @@ class MyHomePage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MyHomePageState extends State<MyHomePage> {
|
class _MyHomePageState extends State<MyHomePage> {
|
||||||
int _counter = 0;
|
String topMessage = "Creating session...";
|
||||||
|
List<Call> camerasToRender = [];
|
||||||
|
|
||||||
void _incrementCounter() {
|
@override
|
||||||
setState(() {
|
void initState() {
|
||||||
// This call to setState tells the Flutter framework that something has
|
super.initState();
|
||||||
// changed in this State, which causes it to rerun the build method below
|
_getSession();
|
||||||
// so that the display can reflect the updated values. If we changed
|
_listCameras();
|
||||||
// _counter without calling setState(), then the build method would not be
|
}
|
||||||
// called again, and so nothing would appear to happen.
|
|
||||||
_counter++;
|
_getSession() async {
|
||||||
|
var token = await widget.sessionService.getAuthToken(widget.home);
|
||||||
|
topMessage = "Created session $token";
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
_listCameras() async {
|
||||||
|
var callOptions = CallOptions(metadata: {
|
||||||
|
'Authorization': await widget.sessionService.getAuthToken(widget.home)
|
||||||
});
|
});
|
||||||
|
var cameras = await widget.client
|
||||||
|
.listCameras(ListCamerasRequest(), options: callOptions);
|
||||||
|
|
||||||
|
for (var camera in cameras.cameras) {
|
||||||
|
camerasToRender.add(Call(
|
||||||
|
widget.client,
|
||||||
|
widget.sessionService,
|
||||||
|
cameraID: camera.identifier,
|
||||||
|
home: widget.home,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -87,18 +135,15 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
// the App.build method, and use it to set our appbar title.
|
// the App.build method, and use it to set our appbar title.
|
||||||
title: Text(widget.title),
|
title: Text(widget.title),
|
||||||
),
|
),
|
||||||
body: const Center(
|
body: Column(
|
||||||
// Center is a layout widget. It takes a single child and positions it
|
// Center is a layout widget. It takes a single child and positions it
|
||||||
// in the middle of the parent.
|
// in the middle of the parent.
|
||||||
child: Call(
|
|
||||||
host: '',
|
children: <Widget>[
|
||||||
|
Text(topMessage),
|
||||||
|
] +
|
||||||
|
camerasToRender,
|
||||||
),
|
),
|
||||||
),
|
|
||||||
floatingActionButton: FloatingActionButton(
|
|
||||||
onPressed: _incrementCounter,
|
|
||||||
tooltip: 'Increment',
|
|
||||||
child: const Icon(Icons.add),
|
|
||||||
), // This trailing comma makes auto-formatting nicer for build methods.
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import 'package:grpc/grpc_or_grpcweb.dart';
|
||||||
|
import 'package:ui/gen/signaler_service.pbgrpc.dart';
|
||||||
|
|
||||||
|
class SessionService {
|
||||||
|
final SignalerServiceClient _stub;
|
||||||
|
final Map<String, ResponseFuture<AuthToken>> _authTokens = {};
|
||||||
|
|
||||||
|
SessionService(this._stub);
|
||||||
|
|
||||||
|
Future<String> getAuthToken(String cameraID) async {
|
||||||
|
var val = await _authTokens.putIfAbsent(cameraID,
|
||||||
|
() => _stub.createAuthToken(CreateAuthTokenRequest(home: cameraID)));
|
||||||
|
return "Bearer ${val.token}";
|
||||||
|
}
|
||||||
|
}
|
||||||
+104
@@ -1,6 +1,22 @@
|
|||||||
# Generated by pub
|
# Generated by pub
|
||||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
packages:
|
packages:
|
||||||
|
archive:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: archive
|
||||||
|
sha256: "1227dc3efc4ea571eebb2dfb814506ed2cfb1d4b1b89fb918abdddde617ead3c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.4.0"
|
||||||
|
args:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: args
|
||||||
|
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.2"
|
||||||
async:
|
async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -41,6 +57,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.17.2"
|
version: "1.17.2"
|
||||||
|
convert:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: convert
|
||||||
|
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.1"
|
||||||
|
crypto:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: crypto
|
||||||
|
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.3"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -73,6 +105,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
|
fixnum:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: fixnum
|
||||||
|
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -99,6 +139,46 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.42+hotfix.1"
|
version: "0.9.42+hotfix.1"
|
||||||
|
googleapis_auth:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: googleapis_auth
|
||||||
|
sha256: af7c3a3edf9d0de2e1e0a77e994fae0a581c525fa7012af4fa0d4a52ed9484da
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.4.1"
|
||||||
|
grpc:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: grpc
|
||||||
|
sha256: e93ee3bce45c134bf44e9728119102358c7cd69de7832d9a874e2e74eb8cab40
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.2.4"
|
||||||
|
http:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: http
|
||||||
|
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
|
http2:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: http2
|
||||||
|
sha256: "38db0c4aa9f1cd238a5d2e86aa0cc7cc91c77e0c6c94ba64bbe85e4ff732a952"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.2.0"
|
||||||
|
http_parser:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: http_parser
|
||||||
|
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.0.2"
|
||||||
js:
|
js:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -227,6 +307,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.6"
|
version: "2.1.6"
|
||||||
|
pointycastle:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: pointycastle
|
||||||
|
sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.7.3"
|
||||||
|
protobuf:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: protobuf
|
||||||
|
sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.0"
|
||||||
pub_semver:
|
pub_semver:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -288,6 +384,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.0"
|
version: "0.6.0"
|
||||||
|
typed_data:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: typed_data
|
||||||
|
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.2"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ dependencies:
|
|||||||
cupertino_icons: ^1.0.2
|
cupertino_icons: ^1.0.2
|
||||||
flutter_webrtc: ^0.9.42+hotfix.1
|
flutter_webrtc: ^0.9.42+hotfix.1
|
||||||
logger: ^2.0.2
|
logger: ^2.0.2
|
||||||
|
protobuf: '>=2.0.0 <4.0.0'
|
||||||
|
grpc: ^3.2.4
|
||||||
|
fixnum: ^1.1.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user