diff --git a/buf.gen.yaml b/buf.gen.yaml index f9f6d71..ae11478 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -10,5 +10,6 @@ plugins: - plugin: buf.build/connectrpc/go out: gen opt: paths=source_relative - - plugin: buf.build/protocolbuffers/dart:v21.1.1 - out: gen \ No newline at end of file + - plugin: dart + out: ui/lib/gen + opt: grpc \ No newline at end of file diff --git a/cmd/signaler/main.go b/cmd/signaler/main.go index d55d2df..4f04e35 100644 --- a/cmd/signaler/main.go +++ b/cmd/signaler/main.go @@ -8,6 +8,9 @@ import ( "connectrpc.com/grpcreflect" servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect" "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() { @@ -26,7 +29,40 @@ func main() { fmt.Printf("Got path %s\n", path) 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) } } diff --git a/cmd/watcher/main.go b/cmd/watcher/main.go index a6ec82c..4cace55 100644 --- a/cmd/watcher/main.go +++ b/cmd/watcher/main.go @@ -5,39 +5,61 @@ package main import ( "context" + "errors" + "flag" "fmt" "io" "log" "net/http" "os" + "sync" "time" "connectrpc.com/connect" pb "github.com/chathaway-codes/home-sensors/v2/gen" servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect" + "github.com/google/uuid" "github.com/pion/webrtc/v3" "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" ) -const ( - videoFileName = "/home/charles/Downloads/simpsons_movie_1080p_hddvd_trailer/The Simpsons Movie - 1080p Trailer.mp4" - oggPageDuration = time.Millisecond * 20 - h264FrameDuration = time.Millisecond * 33 +var ( + 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") ) func withAuth[T any](token string, v *T) *connect.Request[T] { req := connect.NewRequest[T](v) - req.Header().Add("authorization", "Bearer "+token) + req.Header().Add("Authorization", "Bearer "+token) return req } func main() { //nolint + flag.Parse() 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{ + Home: "home1234", Type: &pb.CreateAuthTokenRequest_Camera_{ Camera: &pb.CreateAuthTokenRequest_Camera{ Id: "movie", @@ -48,20 +70,113 @@ func main() { //nolint log.Fatalf("Failed to get auth token: %v", err) } token := authToken.Msg.GetToken() - - // Assert that we have an audio or video file - _, err = os.Stat(videoFileName) - haveVideoFile := !os.IsNotExist(err) - - iceConnectedCtx, iceConnectedCtxCancel := context.WithCancel(context.Background()) + log.Printf("Got token %s", prototext.Format(authToken.Msg)) // Create a new RTCPeerConnection + log.Printf("Waiting for connections") - // Wait for a session request - session, err := client.PopSession(ctx, withAuth(token, &pb.PopSessionRequest{})) - if err != nil { - log.Fatalf("error creating session: %v", err) + for { + // Wait for a session request + session, err := client.PopSession(ctx, withAuth(token, &pb.PopSessionRequest{})) + if err != nil { + 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{ ICEServers: []webrtc.ICEServer{ { @@ -69,78 +184,60 @@ 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() { - if cErr := peerConnection.Close(); cErr != nil { - fmt.Printf("cannot close peerConnection: %v\n", cErr) + if err := peerConnection.Close(); err != nil { + fmt.Printf("cannot close peerConnection: %v\n", err) } }() - if haveVideoFile { - // Create a video track - videoTrack, videoTrackErr := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264}, "video", "pion") - if videoTrackErr != nil { - panic(videoTrackErr) - } - - rtpSender, videoTrackErr := peerConnection.AddTrack(videoTrack) - if videoTrackErr != nil { - panic(videoTrackErr) - } - - // Read incoming RTCP packets - // Before these packets are returned they are processed by interceptors. For things - // like NACK this needs to be called. - go func() { - rtcpBuf := make([]byte, 1500) - for { - if _, _, rtcpErr := rtpSender.Read(rtcpBuf); rtcpErr != nil { - return - } - } - }() - - go func() { - // Open a H264 file and start reading using our IVFReader - file, h264Err := os.Open(videoFileName) - if h264Err != nil { - panic(h264Err) - } - - h264, h264Err := h264reader.NewReader(file) - if h264Err != nil { - panic(h264Err) - } - - // Wait for connection established - <-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) - } - } - }() + // 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 + videoTrack, videoTrackErr := webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{MimeType: trackCodec}, "video", "pion") + if videoTrackErr != nil { + log.Printf("Failed to create video track: %v", err) } + rtpSender, err := peerConnection.AddTrack(videoTrack) + if err != nil { + log.Printf("Failed to add track to connection: %v", err) + } + + // Read incoming RTCP packets + // Before these packets are returned they are processed by interceptors. For things + // like NACK this needs to be called. + go func() { + rtcpBuf := make([]byte, 1500) + for { + if _, _, err := rtpSender.Read(rtcpBuf); err != nil { + return + } + } + }() + + go func() { + defer cleanUp() + readyToSend := false + for frame := range ch { + select { + case <-iceConnectedCtx.Done(): + readyToSend = true + default: + // do nothing + } + if !readyToSend { + continue + } + if err := videoTrack.WriteSample(media.Sample{Data: frame, Duration: time.Second}); err != nil { + panic(err) + } + } + }() + // Set the handler for ICE connection state // This will notify you when the peer has connected/disconnected peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { @@ -160,15 +257,27 @@ func main() { //nolint // Use webrtc.PeerConnectionStateDisconnected if you are interested in detecting faster timeout. // Note that the PeerConnection may come back from PeerConnectionStateDisconnected. fmt.Println("Peer Connection has gone to failed exiting") - os.Exit(0) + return } }) peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) { 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 } c := i.ToJSON() + var usernameFragment *string + if c.UsernameFragment != nil { + usernameFragment = proto.String(*c.UsernameFragment) + } client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{ SessionIdentifier: session.Msg.GetId(), IceMessage: &pb.IceMessage{ @@ -177,74 +286,85 @@ func main() { //nolint Candidate: c.Candidate, SdpMid: c.SDPMid, 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 - go func() { - for { - msg, err := client.PopIceMessage(ctx, withAuth(token, &pb.PopIceMessageRequest{ - SessionIdentifier: session.Msg.GetId(), - })) - if err != nil { - log.Fatalf("failed to pop ice message: %v", err) + for { + msg, err := client.PopIceMessage(ctx, withAuth(token, &pb.PopIceMessageRequest{ + SessionIdentifier: session.Msg.GetId(), + })) + if err != nil { + log.Printf("failed to pop ice message: %v", err) + } + //log.Printf("Got ice message: %v", prototext.Format(msg.Msg)) + switch msg.Msg.Type.(type) { + case *pb.IceMessage_Candidate: + candidate := msg.Msg.GetCandidate() + var sdpMLine *uint16 + if candidate.SdpLineIndex != nil { + t := uint16(candidate.GetSdpLineIndex()) + sdpMLine = &t + } + if err := peerConnection.AddICECandidate(webrtc.ICECandidateInit{ + Candidate: candidate.GetCandidate(), + SDPMid: candidate.SdpMid, + SDPMLineIndex: sdpMLine, + }); err != nil { + log.Fatalf("Failed to add ice candidate: %v", err) } - switch msg.Msg.Type.(type) { - case *pb.IceMessage_Candidate: - candidate := msg.Msg.GetCandidate() - var sdpMLine *uint16 - if candidate.SdpLineIndex != nil { - t := uint16(candidate.GetSdpLineIndex()) - sdpMLine = &t - } - if err := peerConnection.AddICECandidate(webrtc.ICECandidateInit{ - Candidate: candidate.GetCandidate(), - SDPMid: candidate.SdpMid, - SDPMLineIndex: sdpMLine, - }); err != nil { - 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 + answer, err := peerConnection.CreateAnswer(nil) + if err != nil { + log.Printf("Candidate failed") + continue + } - // Send back an answer - answer, err := peerConnection.CreateAnswer(nil) - if err != nil { - log.Fatalf("Failed to create an answer: %v", err) - } - 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{ - IceMessage: &pb.IceMessage{ - Type: &pb.IceMessage_Session{ - Session: &pb.IceSessionDescription{ - SdpType: int64(answer.Type), - Sdp: answer.SDP, - }, + _, err = client.CreateIceMessage(ctx, withAuth(token, &pb.CreateIceMessageRequest{ + SessionIdentifier: session.Msg.GetId(), + IceMessage: &pb.IceMessage{ + Type: &pb.IceMessage_Session{ + Session: &pb.IceSessionDescription{ + SdpType: int64(answer.Type), + Sdp: answer.SDP, }, }, - })) - if err != nil { - log.Fatalf("Failed to send answer: %v", err) - } + }, + })) + if err != nil { + log.Printf("Failed to send answer: %v", err) } - } - }() + case *pb.IceMessage_Session: + iceSession := msg.Msg.GetSession() - // Block forever - select {} + switch iceSession.SdpType { + 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 + } + } } diff --git a/gen/signaler_service.pb.go b/gen/signaler_service.pb.go index ee78ba0..d2f4453 100644 --- a/gen/signaler_service.pb.go +++ b/gen/signaler_service.pb.go @@ -601,6 +601,7 @@ type IceMessage struct { // // *IceMessage_Candidate // *IceMessage_Session + // *IceMessage_NoMoreCandidates Type isIceMessage_Type `protobuf_oneof:"type"` } @@ -657,6 +658,13 @@ func (x *IceMessage) GetSession() *IceSessionDescription { return nil } +func (x *IceMessage) GetNoMoreCandidates() *NoMoreCandidates { + if x, ok := x.GetType().(*IceMessage_NoMoreCandidates); ok { + return x.NoMoreCandidates + } + return nil +} + type isIceMessage_Type interface { isIceMessage_Type() } @@ -669,10 +677,54 @@ type IceMessage_Session struct { 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_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 { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -688,7 +740,7 @@ type IceCandidate struct { func (x *IceCandidate) Reset() { *x = IceCandidate{} 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.StoreMessageInfo(mi) } @@ -701,7 +753,7 @@ func (x *IceCandidate) String() string { func (*IceCandidate) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -714,7 +766,7 @@ func (x *IceCandidate) ProtoReflect() protoreflect.Message { // Deprecated: Use IceCandidate.ProtoReflect.Descriptor instead. 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 { @@ -758,7 +810,7 @@ type IceSessionDescription struct { func (x *IceSessionDescription) Reset() { *x = IceSessionDescription{} 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.StoreMessageInfo(mi) } @@ -771,7 +823,7 @@ func (x *IceSessionDescription) String() string { func (*IceSessionDescription) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -784,7 +836,7 @@ func (x *IceSessionDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use IceSessionDescription.ProtoReflect.Descriptor instead. 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 { @@ -813,7 +865,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} 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.StoreMessageInfo(mi) } @@ -826,7 +878,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -839,7 +891,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. 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 { @@ -867,7 +919,7 @@ type AuthToken struct { func (x *AuthToken) Reset() { *x = AuthToken{} 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.StoreMessageInfo(mi) } @@ -880,7 +932,7 @@ func (x *AuthToken) String() string { func (*AuthToken) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -893,7 +945,7 @@ func (x *AuthToken) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthToken.ProtoReflect.Descriptor instead. 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 { @@ -916,7 +968,7 @@ type CreateAuthTokenRequest_Camera struct { func (x *CreateAuthTokenRequest_Camera) Reset() { *x = CreateAuthTokenRequest_Camera{} 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.StoreMessageInfo(mi) } @@ -929,7 +981,7 @@ func (x *CreateAuthTokenRequest_Camera) String() string { func (*CreateAuthTokenRequest_Camera) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -961,7 +1013,7 @@ type CreateAuthTokenRequest_Client struct { func (x *CreateAuthTokenRequest_Client) Reset() { *x = CreateAuthTokenRequest_Client{} 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.StoreMessageInfo(mi) } @@ -974,7 +1026,7 @@ func (x *CreateAuthTokenRequest_Client) String() string { func (*CreateAuthTokenRequest_Client) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1001,7 +1053,7 @@ type Camera_Identifier struct { func (x *Camera_Identifier) Reset() { *x = Camera_Identifier{} 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.StoreMessageInfo(mi) } @@ -1014,7 +1066,7 @@ func (x *Camera_Identifier) String() string { func (*Camera_Identifier) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1048,7 +1100,7 @@ type Session_Identifier struct { func (x *Session_Identifier) Reset() { *x = Session_Identifier{} 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.StoreMessageInfo(mi) } @@ -1061,7 +1113,7 @@ func (x *Session_Identifier) String() string { func (*Session_Identifier) ProtoMessage() {} 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 { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1074,7 +1126,7 @@ func (x *Session_Identifier) ProtoReflect() protoreflect.Message { // Deprecated: Use Session_Identifier.ProtoReflect.Descriptor instead. 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 { @@ -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, 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, - 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, 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, @@ -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, 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, 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, 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, @@ -1245,7 +1303,7 @@ func file_signaler_service_proto_rawDescGZIP() []byte { 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{}{ (*CreateAuthTokenRequest)(nil), // 0: signaler.CreateAuthTokenRequest (*ListCamerasRequest)(nil), // 1: signaler.ListCamerasRequest @@ -1259,48 +1317,50 @@ var file_signaler_service_proto_goTypes = []interface{}{ (*PopIceMessageRequest)(nil), // 9: signaler.PopIceMessageRequest (*Camera)(nil), // 10: signaler.Camera (*IceMessage)(nil), // 11: signaler.IceMessage - (*IceCandidate)(nil), // 12: signaler.IceCandidate - (*IceSessionDescription)(nil), // 13: signaler.IceSessionDescription - (*Session)(nil), // 14: signaler.Session - (*AuthToken)(nil), // 15: signaler.AuthToken - (*CreateAuthTokenRequest_Camera)(nil), // 16: signaler.CreateAuthTokenRequest.Camera - (*CreateAuthTokenRequest_Client)(nil), // 17: signaler.CreateAuthTokenRequest.Client - (*Camera_Identifier)(nil), // 18: signaler.Camera.Identifier - (*Session_Identifier)(nil), // 19: signaler.Session.Identifier + (*NoMoreCandidates)(nil), // 12: signaler.NoMoreCandidates + (*IceCandidate)(nil), // 13: signaler.IceCandidate + (*IceSessionDescription)(nil), // 14: signaler.IceSessionDescription + (*Session)(nil), // 15: signaler.Session + (*AuthToken)(nil), // 16: signaler.AuthToken + (*CreateAuthTokenRequest_Camera)(nil), // 17: signaler.CreateAuthTokenRequest.Camera + (*CreateAuthTokenRequest_Client)(nil), // 18: signaler.CreateAuthTokenRequest.Client + (*Camera_Identifier)(nil), // 19: signaler.Camera.Identifier + (*Session_Identifier)(nil), // 20: signaler.Session.Identifier } var file_signaler_service_proto_depIdxs = []int32{ - 16, // 0: signaler.CreateAuthTokenRequest.camera:type_name -> signaler.CreateAuthTokenRequest.Camera - 17, // 1: signaler.CreateAuthTokenRequest.client:type_name -> signaler.CreateAuthTokenRequest.Client + 17, // 0: signaler.CreateAuthTokenRequest.camera:type_name -> signaler.CreateAuthTokenRequest.Camera + 18, // 1: signaler.CreateAuthTokenRequest.client:type_name -> signaler.CreateAuthTokenRequest.Client 10, // 2: signaler.ListCamerasResponse.cameras:type_name -> signaler.Camera - 14, // 3: signaler.CreateSessionRequest.session:type_name -> signaler.Session - 14, // 4: signaler.PopSessionRequest.session:type_name -> signaler.Session - 14, // 5: signaler.UpdateSessionRequest.session:type_name -> signaler.Session - 14, // 6: signaler.ListSessionsResponse.sessions:type_name -> signaler.Session - 19, // 7: signaler.CreateIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier + 15, // 3: signaler.CreateSessionRequest.session:type_name -> signaler.Session + 15, // 4: signaler.PopSessionRequest.session:type_name -> signaler.Session + 15, // 5: signaler.UpdateSessionRequest.session:type_name -> signaler.Session + 15, // 6: signaler.ListSessionsResponse.sessions:type_name -> signaler.Session + 20, // 7: signaler.CreateIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier 11, // 8: signaler.CreateIceMessageRequest.ice_message:type_name -> signaler.IceMessage - 19, // 9: signaler.PopIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier - 18, // 10: signaler.Camera.identifier:type_name -> signaler.Camera.Identifier - 12, // 11: signaler.IceMessage.candidate:type_name -> signaler.IceCandidate - 13, // 12: signaler.IceMessage.session:type_name -> signaler.IceSessionDescription - 19, // 13: signaler.Session.id:type_name -> signaler.Session.Identifier - 18, // 14: signaler.Session.camera:type_name -> signaler.Camera.Identifier - 0, // 15: signaler.SignalerService.CreateAuthToken:input_type -> signaler.CreateAuthTokenRequest - 1, // 16: signaler.SignalerService.ListCameras:input_type -> signaler.ListCamerasRequest - 3, // 17: signaler.SignalerService.CreateSession:input_type -> signaler.CreateSessionRequest - 4, // 18: signaler.SignalerService.PopSession:input_type -> signaler.PopSessionRequest - 8, // 19: signaler.SignalerService.CreateIceMessage:input_type -> signaler.CreateIceMessageRequest - 9, // 20: signaler.SignalerService.PopIceMessage:input_type -> signaler.PopIceMessageRequest - 15, // 21: signaler.SignalerService.CreateAuthToken:output_type -> signaler.AuthToken - 2, // 22: signaler.SignalerService.ListCameras:output_type -> signaler.ListCamerasResponse - 14, // 23: signaler.SignalerService.CreateSession:output_type -> signaler.Session - 14, // 24: signaler.SignalerService.PopSession:output_type -> signaler.Session - 11, // 25: signaler.SignalerService.CreateIceMessage:output_type -> signaler.IceMessage - 11, // 26: signaler.SignalerService.PopIceMessage:output_type -> signaler.IceMessage - 21, // [21:27] is the sub-list for method output_type - 15, // [15:21] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 20, // 9: signaler.PopIceMessageRequest.session_identifier:type_name -> signaler.Session.Identifier + 19, // 10: signaler.Camera.identifier:type_name -> signaler.Camera.Identifier + 13, // 11: signaler.IceMessage.candidate:type_name -> signaler.IceCandidate + 14, // 12: signaler.IceMessage.session:type_name -> signaler.IceSessionDescription + 12, // 13: signaler.IceMessage.no_more_candidates:type_name -> signaler.NoMoreCandidates + 20, // 14: signaler.Session.id:type_name -> signaler.Session.Identifier + 19, // 15: signaler.Session.camera:type_name -> signaler.Camera.Identifier + 0, // 16: signaler.SignalerService.CreateAuthToken:input_type -> signaler.CreateAuthTokenRequest + 1, // 17: signaler.SignalerService.ListCameras:input_type -> signaler.ListCamerasRequest + 3, // 18: signaler.SignalerService.CreateSession:input_type -> signaler.CreateSessionRequest + 4, // 19: signaler.SignalerService.PopSession:input_type -> signaler.PopSessionRequest + 8, // 20: signaler.SignalerService.CreateIceMessage:input_type -> signaler.CreateIceMessageRequest + 9, // 21: signaler.SignalerService.PopIceMessage:input_type -> signaler.PopIceMessageRequest + 16, // 22: signaler.SignalerService.CreateAuthToken:output_type -> signaler.AuthToken + 2, // 23: signaler.SignalerService.ListCameras:output_type -> signaler.ListCamerasResponse + 15, // 24: signaler.SignalerService.CreateSession:output_type -> signaler.Session + 15, // 25: signaler.SignalerService.PopSession:output_type -> signaler.Session + 11, // 26: signaler.SignalerService.CreateIceMessage:output_type -> signaler.IceMessage + 11, // 27: signaler.SignalerService.PopIceMessage:output_type -> signaler.IceMessage + 22, // [22:28] is the sub-list for method output_type + 16, // [16:22] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension 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() } @@ -1454,7 +1514,7 @@ func file_signaler_service_proto_init() { } } 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: return &v.state 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{} { - switch v := v.(*IceSessionDescription); i { + switch v := v.(*IceCandidate); i { case 0: return &v.state 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{} { - switch v := v.(*Session); i { + switch v := v.(*IceSessionDescription); i { case 0: return &v.state 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{} { - switch v := v.(*AuthToken); i { + switch v := v.(*Session); i { case 0: return &v.state 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{} { - switch v := v.(*CreateAuthTokenRequest_Camera); i { + switch v := v.(*AuthToken); i { case 0: return &v.state 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{} { - switch v := v.(*CreateAuthTokenRequest_Client); i { + switch v := v.(*CreateAuthTokenRequest_Camera); i { case 0: return &v.state 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{} { - switch v := v.(*Camera_Identifier); i { + switch v := v.(*CreateAuthTokenRequest_Client); i { case 0: return &v.state 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{} { + 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 { case 0: return &v.state @@ -1557,15 +1629,16 @@ func file_signaler_service_proto_init() { file_signaler_service_proto_msgTypes[11].OneofWrappers = []interface{}{ (*IceMessage_Candidate)(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{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_signaler_service_proto_rawDesc, NumEnums: 0, - NumMessages: 20, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/go.mod b/go.mod index 1c20247..cabe722 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,9 @@ require ( connectrpc.com/connect v1.11.1 connectrpc.com/grpcreflect v1.2.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/rs/cors v1.10.0 + golang.org/x/net v0.14.0 google.golang.org/grpc v1.58.1 google.golang.org/protobuf v1.31.0 ) @@ -34,8 +35,8 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/testify v1.8.4 // 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/text v0.12.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2d609f9..c95f59b 100644 --- a/go.sum +++ b/go.sum @@ -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/grpcreflect v1.2.0 h1:Q6og1S7HinmtbEuBvARLNwYmTbhEGRpHDhqrPNlmK+U= 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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 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.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= 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/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/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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/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.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= 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.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.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= 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.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= 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/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/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/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/go.mod h1:tpvvF4cPM6NGxFA1DUMbhabzQBxdWMATDGEUYOR9x6I= 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/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/go.mod h1:hYE72WX8WDveIhg7fmXgMKivD3Puklk0Ymzog0lSyaI= 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/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/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/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.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U= 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/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/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/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/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.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/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/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/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/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/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.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.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.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 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/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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-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-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.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.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= 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/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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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-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-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-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-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-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.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= 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-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-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-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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/pkg/signaler/signaler.go b/pkg/signaler/signaler.go index db785f5..9e32a6c 100644 --- a/pkg/signaler/signaler.go +++ b/pkg/signaler/signaler.go @@ -5,6 +5,7 @@ import ( "context" "encoding/base64" "fmt" + "log" "strings" "sync" "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) { req := request.Msg + log.Printf("Creating auth token") + defer log.Printf("Done creating auth token") var id string switch req.Type.(type) { case *pb.CreateAuthTokenRequest_Camera_: id = req.GetCamera().GetId() - s.mu.Lock() thisCamera := &camera{ id: id, } home := req.GetHome() + s.mu.Lock() if _, ok := s.camerasByHome[home]; !ok { s.camerasByHome[home] = make(map[string]*camera) } s.camerasByHome[home][id] = thisCamera - if _, ok := s.sessionsByCamera[id]; !ok { - s.sessionsByCamera[id] = make(chan *session, 100) + if _, ok := s.sessionsByCamera[id]; ok { + close(s.sessionsByCamera[id]) } + s.sessionsByCamera[id] = make(chan *session, 100) s.mu.Unlock() case *pb.CreateAuthTokenRequest_Client_: 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 // 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) { + + log.Printf("Creating session") + defer log.Printf("Done session") thisSession := request.Msg.Session if thisSession == nil { 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() thisSession.Id = &pb.Session_Identifier{Id: id} cameraID := thisSession.GetCamera().GetId() - s.mu.Lock() - defer s.mu.Unlock() sess := &session{ id: id, @@ -135,8 +140,13 @@ func (s *Server) CreateSession(ctx context.Context, request *connect.Request[pb. toCamera: 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.mu.Unlock() + + ch <- sess return connect.NewResponse(thisSession), nil } @@ -161,6 +171,10 @@ func (s *Server) PopSession(ctx context.Context, request *connect.Request[pb.Pop sess := <-ch + if sess == nil { + return nil, status.Errorf(codes.DataLoss, "someone else stole the session") + } + return connect.NewResponse(&pb.Session{ Id: &pb.Session_Identifier{ Id: sess.id, @@ -228,8 +242,10 @@ func (s *Server) cleanup() { ticker := time.NewTicker(time.Minute * 5) for t := range ticker.C { func() { + log.Printf("Starting cleanup") s.mu.Lock() defer s.mu.Unlock() + log.Printf("Cleanup locked") // Look for any stale sessions staleSessionsByCamera := make(map[string]*session) @@ -245,16 +261,9 @@ func (s *Server) cleanup() { } } } + log.Printf("Removing stale sessions") - for camera, lastSession := range staleSessionsByCamera { - // 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 - } - } - } + // TODO: how do we prevent sessions from accumlating if cameras don't pick up on the request? }() } } diff --git a/proto/signaler_service.proto b/proto/signaler_service.proto index b43af0f..273c857 100644 --- a/proto/signaler_service.proto +++ b/proto/signaler_service.proto @@ -96,9 +96,12 @@ message IceMessage { oneof type { IceCandidate candidate = 1; IceSessionDescription session = 2; + NoMoreCandidates no_more_candidates = 3; } } +message NoMoreCandidates {} + message IceCandidate { // Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#ICECandidateInit string candidate = 1; diff --git a/ui/android/app/build.gradle b/ui/android/app/build.gradle index e9c9fdf..d6d1cac 100644 --- a/ui/android/app/build.gradle +++ b/ui/android/app/build.gradle @@ -45,7 +45,7 @@ android { applicationId "com.example.ui" // 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. - minSdkVersion flutter.minSdkVersion + minSdkVersion 21 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/ui/android/app/src/main/AndroidManifest.xml b/ui/android/app/src/main/AndroidManifest.xml index c1f987f..9909624 100644 --- a/ui/android/app/src/main/AndroidManifest.xml +++ b/ui/android/app/src/main/AndroidManifest.xml @@ -30,4 +30,6 @@ android:name="flutterEmbedding" android:value="2" /> + + diff --git a/ui/lib/call.dart b/ui/lib/call.dart index 8eedf3c..c9efa40 100644 --- a/ui/lib/call.dart +++ b/ui/lib/call.dart @@ -1,22 +1,60 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:grpc/grpc.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 { - final String host; - const Call({required this.host, super.key}); + final pb.SignalerServiceClient client; + 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 - _CallState createState() => _CallState(); + CallState createState() => CallState(); } -class _CallState extends State { +class CallState extends State { 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 _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({ // Ice servers; just use the Google one for now 'iceServers': [ @@ -28,47 +66,129 @@ class _CallState extends State { peerConnection.onAddStream = (stream) { // Stream has been added; connect it to our renderer + logger.i("Got stream from remote; connecting it"); _remoteRenderer.srcObject = stream; + _ready = true; + setState(() {}); }; - peerConnection.onIceCandidate = (candidate) { + peerConnection.onIceCandidate = (candidate) async { if (candidate.candidate == null) { - logger.i("Out of candidates"); + await widget.client.createIceMessage( + CreateIceMessageRequest( + sessionIdentifier: clientSession.id, + iceMessage: IceMessage( + noMoreCandidates: NoMoreCandidates(), + )), + options: callOptions); 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.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, // then propose one to use - var offer = peerConnection.createOffer(); + var offer = await peerConnection.createOffer(); + await peerConnection.setLocalDescription(offer); // Send offer through signaling server 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); - return session; + // Get candidates from remote + 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 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 { - RTCPeerConnection peerConnection; - - Session(this.peerConnection); - List remoteCandidates = []; -} +class CallCancelled {} diff --git a/ui/lib/gen/signaler_service.pb.dart b/ui/lib/gen/signaler_service.pb.dart new file mode 100644 index 0000000..8830cde --- /dev/null +++ b/ui/lib/gen/signaler_service.pb.dart @@ -0,0 +1,1224 @@ +// +// 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:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +class CreateAuthTokenRequest_Camera extends $pb.GeneratedMessage { + factory CreateAuthTokenRequest_Camera({ + $core.String? id, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + return $result; + } + CreateAuthTokenRequest_Camera._() : super(); + factory CreateAuthTokenRequest_Camera.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateAuthTokenRequest_Camera.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAuthTokenRequest.Camera', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest_Camera clone() => CreateAuthTokenRequest_Camera()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest_Camera copyWith(void Function(CreateAuthTokenRequest_Camera) updates) => super.copyWith((message) => updates(message as CreateAuthTokenRequest_Camera)) as CreateAuthTokenRequest_Camera; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest_Camera create() => CreateAuthTokenRequest_Camera._(); + CreateAuthTokenRequest_Camera createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest_Camera getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateAuthTokenRequest_Camera? _defaultInstance; + + /// Used to uniquely identifier this camera so clients can open + /// sessions with it. + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); +} + +class CreateAuthTokenRequest_Client extends $pb.GeneratedMessage { + factory CreateAuthTokenRequest_Client() => create(); + CreateAuthTokenRequest_Client._() : super(); + factory CreateAuthTokenRequest_Client.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateAuthTokenRequest_Client.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAuthTokenRequest.Client', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest_Client clone() => CreateAuthTokenRequest_Client()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest_Client copyWith(void Function(CreateAuthTokenRequest_Client) updates) => super.copyWith((message) => updates(message as CreateAuthTokenRequest_Client)) as CreateAuthTokenRequest_Client; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest_Client create() => CreateAuthTokenRequest_Client._(); + CreateAuthTokenRequest_Client createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest_Client getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateAuthTokenRequest_Client? _defaultInstance; +} + +enum CreateAuthTokenRequest_Type { + camera, + client, + notSet +} + +class CreateAuthTokenRequest extends $pb.GeneratedMessage { + factory CreateAuthTokenRequest({ + $core.String? home, + CreateAuthTokenRequest_Camera? camera, + CreateAuthTokenRequest_Client? client, + }) { + final $result = create(); + if (home != null) { + $result.home = home; + } + if (camera != null) { + $result.camera = camera; + } + if (client != null) { + $result.client = client; + } + return $result; + } + CreateAuthTokenRequest._() : super(); + factory CreateAuthTokenRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateAuthTokenRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, CreateAuthTokenRequest_Type> _CreateAuthTokenRequest_TypeByTag = { + 2 : CreateAuthTokenRequest_Type.camera, + 3 : CreateAuthTokenRequest_Type.client, + 0 : CreateAuthTokenRequest_Type.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateAuthTokenRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..oo(0, [2, 3]) + ..aOS(1, _omitFieldNames ? '' : 'home') + ..aOM(2, _omitFieldNames ? '' : 'camera', subBuilder: CreateAuthTokenRequest_Camera.create) + ..aOM(3, _omitFieldNames ? '' : 'client', subBuilder: CreateAuthTokenRequest_Client.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest clone() => CreateAuthTokenRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateAuthTokenRequest copyWith(void Function(CreateAuthTokenRequest) updates) => super.copyWith((message) => updates(message as CreateAuthTokenRequest)) as CreateAuthTokenRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest create() => CreateAuthTokenRequest._(); + CreateAuthTokenRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateAuthTokenRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateAuthTokenRequest? _defaultInstance; + + CreateAuthTokenRequest_Type whichType() => _CreateAuthTokenRequest_TypeByTag[$_whichOneof(0)]!; + void clearType() => clearField($_whichOneof(0)); + + /// Homes this auth token should be registered too. + @$pb.TagNumber(1) + $core.String get home => $_getSZ(0); + @$pb.TagNumber(1) + set home($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasHome() => $_has(0); + @$pb.TagNumber(1) + void clearHome() => clearField(1); + + @$pb.TagNumber(2) + CreateAuthTokenRequest_Camera get camera => $_getN(1); + @$pb.TagNumber(2) + set camera(CreateAuthTokenRequest_Camera v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasCamera() => $_has(1); + @$pb.TagNumber(2) + void clearCamera() => clearField(2); + @$pb.TagNumber(2) + CreateAuthTokenRequest_Camera ensureCamera() => $_ensure(1); + + @$pb.TagNumber(3) + CreateAuthTokenRequest_Client get client => $_getN(2); + @$pb.TagNumber(3) + set client(CreateAuthTokenRequest_Client v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasClient() => $_has(2); + @$pb.TagNumber(3) + void clearClient() => clearField(3); + @$pb.TagNumber(3) + CreateAuthTokenRequest_Client ensureClient() => $_ensure(2); +} + +class ListCamerasRequest extends $pb.GeneratedMessage { + factory ListCamerasRequest() => create(); + ListCamerasRequest._() : super(); + factory ListCamerasRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ListCamerasRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListCamerasRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ListCamerasRequest clone() => ListCamerasRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ListCamerasRequest copyWith(void Function(ListCamerasRequest) updates) => super.copyWith((message) => updates(message as ListCamerasRequest)) as ListCamerasRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListCamerasRequest create() => ListCamerasRequest._(); + ListCamerasRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListCamerasRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ListCamerasRequest? _defaultInstance; +} + +class ListCamerasResponse extends $pb.GeneratedMessage { + factory ListCamerasResponse({ + $core.Iterable? cameras, + }) { + final $result = create(); + if (cameras != null) { + $result.cameras.addAll(cameras); + } + return $result; + } + ListCamerasResponse._() : super(); + factory ListCamerasResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ListCamerasResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListCamerasResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'cameras', $pb.PbFieldType.PM, subBuilder: Camera.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ListCamerasResponse clone() => ListCamerasResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ListCamerasResponse copyWith(void Function(ListCamerasResponse) updates) => super.copyWith((message) => updates(message as ListCamerasResponse)) as ListCamerasResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListCamerasResponse create() => ListCamerasResponse._(); + ListCamerasResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListCamerasResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ListCamerasResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get cameras => $_getList(0); +} + +class CreateSessionRequest extends $pb.GeneratedMessage { + factory CreateSessionRequest({ + Session? session, + $core.bool? waitForUpdate, + }) { + final $result = create(); + if (session != null) { + $result.session = session; + } + if (waitForUpdate != null) { + $result.waitForUpdate = waitForUpdate; + } + return $result; + } + CreateSessionRequest._() : super(); + factory CreateSessionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateSessionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateSessionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'session', subBuilder: Session.create) + ..aOB(2, _omitFieldNames ? '' : 'waitForUpdate') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateSessionRequest clone() => CreateSessionRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateSessionRequest copyWith(void Function(CreateSessionRequest) updates) => super.copyWith((message) => updates(message as CreateSessionRequest)) as CreateSessionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateSessionRequest create() => CreateSessionRequest._(); + CreateSessionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateSessionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateSessionRequest? _defaultInstance; + + @$pb.TagNumber(1) + Session get session => $_getN(0); + @$pb.TagNumber(1) + set session(Session v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasSession() => $_has(0); + @$pb.TagNumber(1) + void clearSession() => clearField(1); + @$pb.TagNumber(1) + Session ensureSession() => $_ensure(0); + + /// If true, will keep the connection alive until an update is received. + /// This is useful if we need to wait for a remote to detect the session + /// request and update it with their candidates, offer, or answer. + @$pb.TagNumber(2) + $core.bool get waitForUpdate => $_getBF(1); + @$pb.TagNumber(2) + set waitForUpdate($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasWaitForUpdate() => $_has(1); + @$pb.TagNumber(2) + void clearWaitForUpdate() => clearField(2); +} + +class PopSessionRequest extends $pb.GeneratedMessage { + factory PopSessionRequest({ + Session? session, + }) { + final $result = create(); + if (session != null) { + $result.session = session; + } + return $result; + } + PopSessionRequest._() : super(); + factory PopSessionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PopSessionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PopSessionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'session', subBuilder: Session.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PopSessionRequest clone() => PopSessionRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PopSessionRequest copyWith(void Function(PopSessionRequest) updates) => super.copyWith((message) => updates(message as PopSessionRequest)) as PopSessionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PopSessionRequest create() => PopSessionRequest._(); + PopSessionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PopSessionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PopSessionRequest? _defaultInstance; + + @$pb.TagNumber(1) + Session get session => $_getN(0); + @$pb.TagNumber(1) + set session(Session v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasSession() => $_has(0); + @$pb.TagNumber(1) + void clearSession() => clearField(1); + @$pb.TagNumber(1) + Session ensureSession() => $_ensure(0); +} + +class UpdateSessionRequest extends $pb.GeneratedMessage { + factory UpdateSessionRequest({ + Session? session, + $core.bool? waitForUpdate, + }) { + final $result = create(); + if (session != null) { + $result.session = session; + } + if (waitForUpdate != null) { + $result.waitForUpdate = waitForUpdate; + } + return $result; + } + UpdateSessionRequest._() : super(); + factory UpdateSessionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory UpdateSessionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UpdateSessionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'session', subBuilder: Session.create) + ..aOB(2, _omitFieldNames ? '' : 'waitForUpdate') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + UpdateSessionRequest clone() => UpdateSessionRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UpdateSessionRequest copyWith(void Function(UpdateSessionRequest) updates) => super.copyWith((message) => updates(message as UpdateSessionRequest)) as UpdateSessionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static UpdateSessionRequest create() => UpdateSessionRequest._(); + UpdateSessionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static UpdateSessionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UpdateSessionRequest? _defaultInstance; + + @$pb.TagNumber(1) + Session get session => $_getN(0); + @$pb.TagNumber(1) + set session(Session v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasSession() => $_has(0); + @$pb.TagNumber(1) + void clearSession() => clearField(1); + @$pb.TagNumber(1) + Session ensureSession() => $_ensure(0); + + /// If true, will keep the connection alive until an update is received. + /// This is useful if we need to wait for a remote to detect the session + /// request and update it with their candidates, offer, or answer. + @$pb.TagNumber(2) + $core.bool get waitForUpdate => $_getBF(1); + @$pb.TagNumber(2) + set waitForUpdate($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasWaitForUpdate() => $_has(1); + @$pb.TagNumber(2) + void clearWaitForUpdate() => clearField(2); +} + +class ListSessionsRequest extends $pb.GeneratedMessage { + factory ListSessionsRequest() => create(); + ListSessionsRequest._() : super(); + factory ListSessionsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ListSessionsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListSessionsRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ListSessionsRequest clone() => ListSessionsRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ListSessionsRequest copyWith(void Function(ListSessionsRequest) updates) => super.copyWith((message) => updates(message as ListSessionsRequest)) as ListSessionsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSessionsRequest create() => ListSessionsRequest._(); + ListSessionsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSessionsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ListSessionsRequest? _defaultInstance; +} + +class ListSessionsResponse extends $pb.GeneratedMessage { + factory ListSessionsResponse({ + $core.Iterable? sessions, + }) { + final $result = create(); + if (sessions != null) { + $result.sessions.addAll(sessions); + } + return $result; + } + ListSessionsResponse._() : super(); + factory ListSessionsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ListSessionsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListSessionsResponse', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'sessions', $pb.PbFieldType.PM, subBuilder: Session.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ListSessionsResponse clone() => ListSessionsResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ListSessionsResponse copyWith(void Function(ListSessionsResponse) updates) => super.copyWith((message) => updates(message as ListSessionsResponse)) as ListSessionsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListSessionsResponse create() => ListSessionsResponse._(); + ListSessionsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ListSessionsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ListSessionsResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get sessions => $_getList(0); +} + +class CreateIceMessageRequest extends $pb.GeneratedMessage { + factory CreateIceMessageRequest({ + Session_Identifier? sessionIdentifier, + IceMessage? iceMessage, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + if (iceMessage != null) { + $result.iceMessage = iceMessage; + } + return $result; + } + CreateIceMessageRequest._() : super(); + factory CreateIceMessageRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateIceMessageRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateIceMessageRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'sessionIdentifier', subBuilder: Session_Identifier.create) + ..aOM(2, _omitFieldNames ? '' : 'iceMessage', subBuilder: IceMessage.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CreateIceMessageRequest clone() => CreateIceMessageRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateIceMessageRequest copyWith(void Function(CreateIceMessageRequest) updates) => super.copyWith((message) => updates(message as CreateIceMessageRequest)) as CreateIceMessageRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateIceMessageRequest create() => CreateIceMessageRequest._(); + CreateIceMessageRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateIceMessageRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateIceMessageRequest? _defaultInstance; + + @$pb.TagNumber(1) + Session_Identifier get sessionIdentifier => $_getN(0); + @$pb.TagNumber(1) + set sessionIdentifier(Session_Identifier v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasSessionIdentifier() => $_has(0); + @$pb.TagNumber(1) + void clearSessionIdentifier() => clearField(1); + @$pb.TagNumber(1) + Session_Identifier ensureSessionIdentifier() => $_ensure(0); + + @$pb.TagNumber(2) + IceMessage get iceMessage => $_getN(1); + @$pb.TagNumber(2) + set iceMessage(IceMessage v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasIceMessage() => $_has(1); + @$pb.TagNumber(2) + void clearIceMessage() => clearField(2); + @$pb.TagNumber(2) + IceMessage ensureIceMessage() => $_ensure(1); +} + +class PopIceMessageRequest extends $pb.GeneratedMessage { + factory PopIceMessageRequest({ + Session_Identifier? sessionIdentifier, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + return $result; + } + PopIceMessageRequest._() : super(); + factory PopIceMessageRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PopIceMessageRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PopIceMessageRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'sessionIdentifier', subBuilder: Session_Identifier.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PopIceMessageRequest clone() => PopIceMessageRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PopIceMessageRequest copyWith(void Function(PopIceMessageRequest) updates) => super.copyWith((message) => updates(message as PopIceMessageRequest)) as PopIceMessageRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PopIceMessageRequest create() => PopIceMessageRequest._(); + PopIceMessageRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PopIceMessageRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PopIceMessageRequest? _defaultInstance; + + @$pb.TagNumber(1) + Session_Identifier get sessionIdentifier => $_getN(0); + @$pb.TagNumber(1) + set sessionIdentifier(Session_Identifier v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasSessionIdentifier() => $_has(0); + @$pb.TagNumber(1) + void clearSessionIdentifier() => clearField(1); + @$pb.TagNumber(1) + Session_Identifier ensureSessionIdentifier() => $_ensure(0); +} + +class Camera_Identifier extends $pb.GeneratedMessage { + factory Camera_Identifier({ + $core.String? id, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + return $result; + } + Camera_Identifier._() : super(); + factory Camera_Identifier.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Camera_Identifier.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Camera.Identifier', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Camera_Identifier clone() => Camera_Identifier()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Camera_Identifier copyWith(void Function(Camera_Identifier) updates) => super.copyWith((message) => updates(message as Camera_Identifier)) as Camera_Identifier; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Camera_Identifier create() => Camera_Identifier._(); + Camera_Identifier createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Camera_Identifier getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Camera_Identifier? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); +} + +class Camera extends $pb.GeneratedMessage { + factory Camera({ + Camera_Identifier? identifier, + }) { + final $result = create(); + if (identifier != null) { + $result.identifier = identifier; + } + return $result; + } + Camera._() : super(); + factory Camera.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Camera.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Camera', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'identifier', subBuilder: Camera_Identifier.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Camera clone() => Camera()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Camera copyWith(void Function(Camera) updates) => super.copyWith((message) => updates(message as Camera)) as Camera; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Camera create() => Camera._(); + Camera createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Camera getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Camera? _defaultInstance; + + @$pb.TagNumber(1) + Camera_Identifier get identifier => $_getN(0); + @$pb.TagNumber(1) + set identifier(Camera_Identifier v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasIdentifier() => $_has(0); + @$pb.TagNumber(1) + void clearIdentifier() => clearField(1); + @$pb.TagNumber(1) + Camera_Identifier ensureIdentifier() => $_ensure(0); +} + +enum IceMessage_Type { + candidate, + session, + noMoreCandidates, + notSet +} + +class IceMessage extends $pb.GeneratedMessage { + factory IceMessage({ + IceCandidate? candidate, + IceSessionDescription? session, + NoMoreCandidates? noMoreCandidates, + }) { + final $result = create(); + if (candidate != null) { + $result.candidate = candidate; + } + if (session != null) { + $result.session = session; + } + if (noMoreCandidates != null) { + $result.noMoreCandidates = noMoreCandidates; + } + return $result; + } + IceMessage._() : super(); + factory IceMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory IceMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static const $core.Map<$core.int, IceMessage_Type> _IceMessage_TypeByTag = { + 1 : IceMessage_Type.candidate, + 2 : IceMessage_Type.session, + 3 : IceMessage_Type.noMoreCandidates, + 0 : IceMessage_Type.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'IceMessage', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..oo(0, [1, 2, 3]) + ..aOM(1, _omitFieldNames ? '' : 'candidate', subBuilder: IceCandidate.create) + ..aOM(2, _omitFieldNames ? '' : 'session', subBuilder: IceSessionDescription.create) + ..aOM(3, _omitFieldNames ? '' : 'noMoreCandidates', subBuilder: NoMoreCandidates.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + IceMessage clone() => IceMessage()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + IceMessage copyWith(void Function(IceMessage) updates) => super.copyWith((message) => updates(message as IceMessage)) as IceMessage; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IceMessage create() => IceMessage._(); + IceMessage createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IceMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static IceMessage? _defaultInstance; + + IceMessage_Type whichType() => _IceMessage_TypeByTag[$_whichOneof(0)]!; + void clearType() => clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + IceCandidate get candidate => $_getN(0); + @$pb.TagNumber(1) + set candidate(IceCandidate v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasCandidate() => $_has(0); + @$pb.TagNumber(1) + void clearCandidate() => clearField(1); + @$pb.TagNumber(1) + IceCandidate ensureCandidate() => $_ensure(0); + + @$pb.TagNumber(2) + IceSessionDescription get session => $_getN(1); + @$pb.TagNumber(2) + set session(IceSessionDescription v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasSession() => $_has(1); + @$pb.TagNumber(2) + void clearSession() => clearField(2); + @$pb.TagNumber(2) + IceSessionDescription ensureSession() => $_ensure(1); + + @$pb.TagNumber(3) + NoMoreCandidates get noMoreCandidates => $_getN(2); + @$pb.TagNumber(3) + set noMoreCandidates(NoMoreCandidates v) { setField(3, v); } + @$pb.TagNumber(3) + $core.bool hasNoMoreCandidates() => $_has(2); + @$pb.TagNumber(3) + void clearNoMoreCandidates() => clearField(3); + @$pb.TagNumber(3) + NoMoreCandidates ensureNoMoreCandidates() => $_ensure(2); +} + +class NoMoreCandidates extends $pb.GeneratedMessage { + factory NoMoreCandidates() => create(); + NoMoreCandidates._() : super(); + factory NoMoreCandidates.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory NoMoreCandidates.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'NoMoreCandidates', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + NoMoreCandidates clone() => NoMoreCandidates()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + NoMoreCandidates copyWith(void Function(NoMoreCandidates) updates) => super.copyWith((message) => updates(message as NoMoreCandidates)) as NoMoreCandidates; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static NoMoreCandidates create() => NoMoreCandidates._(); + NoMoreCandidates createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static NoMoreCandidates getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static NoMoreCandidates? _defaultInstance; +} + +class IceCandidate extends $pb.GeneratedMessage { + factory IceCandidate({ + $core.String? candidate, + $core.String? sdpMid, + $core.int? sdpLineIndex, + $core.String? usernameFragment, + }) { + final $result = create(); + if (candidate != null) { + $result.candidate = candidate; + } + if (sdpMid != null) { + $result.sdpMid = sdpMid; + } + if (sdpLineIndex != null) { + $result.sdpLineIndex = sdpLineIndex; + } + if (usernameFragment != null) { + $result.usernameFragment = usernameFragment; + } + return $result; + } + IceCandidate._() : super(); + factory IceCandidate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory IceCandidate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'IceCandidate', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'candidate') + ..aOS(2, _omitFieldNames ? '' : 'sdpMid') + ..a<$core.int>(3, _omitFieldNames ? '' : 'sdpLineIndex', $pb.PbFieldType.O3) + ..aOS(4, _omitFieldNames ? '' : 'usernameFragment') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + IceCandidate clone() => IceCandidate()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + IceCandidate copyWith(void Function(IceCandidate) updates) => super.copyWith((message) => updates(message as IceCandidate)) as IceCandidate; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IceCandidate create() => IceCandidate._(); + IceCandidate createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IceCandidate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static IceCandidate? _defaultInstance; + + /// Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#ICECandidateInit + @$pb.TagNumber(1) + $core.String get candidate => $_getSZ(0); + @$pb.TagNumber(1) + set candidate($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasCandidate() => $_has(0); + @$pb.TagNumber(1) + void clearCandidate() => clearField(1); + + @$pb.TagNumber(2) + $core.String get sdpMid => $_getSZ(1); + @$pb.TagNumber(2) + set sdpMid($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasSdpMid() => $_has(1); + @$pb.TagNumber(2) + void clearSdpMid() => clearField(2); + + @$pb.TagNumber(3) + $core.int get sdpLineIndex => $_getIZ(2); + @$pb.TagNumber(3) + set sdpLineIndex($core.int v) { $_setSignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasSdpLineIndex() => $_has(2); + @$pb.TagNumber(3) + void clearSdpLineIndex() => clearField(3); + + @$pb.TagNumber(4) + $core.String get usernameFragment => $_getSZ(3); + @$pb.TagNumber(4) + set usernameFragment($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasUsernameFragment() => $_has(3); + @$pb.TagNumber(4) + void clearUsernameFragment() => clearField(4); +} + +class IceSessionDescription extends $pb.GeneratedMessage { + factory IceSessionDescription({ + $fixnum.Int64? sdpType, + $core.String? sdp, + }) { + final $result = create(); + if (sdpType != null) { + $result.sdpType = sdpType; + } + if (sdp != null) { + $result.sdp = sdp; + } + return $result; + } + IceSessionDescription._() : super(); + factory IceSessionDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory IceSessionDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'IceSessionDescription', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aInt64(1, _omitFieldNames ? '' : 'sdpType') + ..aOS(2, _omitFieldNames ? '' : 'sdp') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + IceSessionDescription clone() => IceSessionDescription()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + IceSessionDescription copyWith(void Function(IceSessionDescription) updates) => super.copyWith((message) => updates(message as IceSessionDescription)) as IceSessionDescription; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IceSessionDescription create() => IceSessionDescription._(); + IceSessionDescription createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static IceSessionDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static IceSessionDescription? _defaultInstance; + + /// Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#SessionDescription + @$pb.TagNumber(1) + $fixnum.Int64 get sdpType => $_getI64(0); + @$pb.TagNumber(1) + set sdpType($fixnum.Int64 v) { $_setInt64(0, v); } + @$pb.TagNumber(1) + $core.bool hasSdpType() => $_has(0); + @$pb.TagNumber(1) + void clearSdpType() => clearField(1); + + @$pb.TagNumber(2) + $core.String get sdp => $_getSZ(1); + @$pb.TagNumber(2) + set sdp($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasSdp() => $_has(1); + @$pb.TagNumber(2) + void clearSdp() => clearField(2); +} + +class Session_Identifier extends $pb.GeneratedMessage { + factory Session_Identifier({ + $core.String? id, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + return $result; + } + Session_Identifier._() : super(); + factory Session_Identifier.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Session_Identifier.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Session.Identifier', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Session_Identifier clone() => Session_Identifier()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Session_Identifier copyWith(void Function(Session_Identifier) updates) => super.copyWith((message) => updates(message as Session_Identifier)) as Session_Identifier; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Session_Identifier create() => Session_Identifier._(); + Session_Identifier createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Session_Identifier getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Session_Identifier? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); +} + +class Session extends $pb.GeneratedMessage { + factory Session({ + Session_Identifier? id, + Camera_Identifier? camera, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + if (camera != null) { + $result.camera = camera; + } + return $result; + } + Session._() : super(); + factory Session.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Session.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Session', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'id', subBuilder: Session_Identifier.create) + ..aOM(2, _omitFieldNames ? '' : 'camera', subBuilder: Camera_Identifier.create) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Session clone() => Session()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Session copyWith(void Function(Session) updates) => super.copyWith((message) => updates(message as Session)) as Session; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Session create() => Session._(); + Session createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Session getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Session? _defaultInstance; + + @$pb.TagNumber(1) + Session_Identifier get id => $_getN(0); + @$pb.TagNumber(1) + set id(Session_Identifier v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + @$pb.TagNumber(1) + Session_Identifier ensureId() => $_ensure(0); + + @$pb.TagNumber(2) + Camera_Identifier get camera => $_getN(1); + @$pb.TagNumber(2) + set camera(Camera_Identifier v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasCamera() => $_has(1); + @$pb.TagNumber(2) + void clearCamera() => clearField(2); + @$pb.TagNumber(2) + Camera_Identifier ensureCamera() => $_ensure(1); +} + +class AuthToken extends $pb.GeneratedMessage { + factory AuthToken({ + $core.String? token, + }) { + final $result = create(); + if (token != null) { + $result.token = token; + } + 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 ? '' : 'signaler'), createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'token') + ..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 createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AuthToken getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static AuthToken? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get token => $_getSZ(0); + @$pb.TagNumber(1) + set token($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasToken() => $_has(0); + @$pb.TagNumber(1) + void clearToken() => clearField(1); +} + + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/ui/lib/gen/signaler_service.pbenum.dart b/ui/lib/gen/signaler_service.pbenum.dart new file mode 100644 index 0000000..65d3e63 --- /dev/null +++ b/ui/lib/gen/signaler_service.pbenum.dart @@ -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 + diff --git a/ui/lib/gen/signaler_service.pbgrpc.dart b/ui/lib/gen/signaler_service.pbgrpc.dart new file mode 100644 index 0000000..afa4432 --- /dev/null +++ b/ui/lib/gen/signaler_service.pbgrpc.dart @@ -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); +} diff --git a/ui/lib/gen/signaler_service.pbjson.dart b/ui/lib/gen/signaler_service.pbjson.dart new file mode 100644 index 0000000..e3ecfa5 --- /dev/null +++ b/ui/lib/gen/signaler_service.pbjson.dart @@ -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'); + diff --git a/ui/lib/gen/token/token.pb.dart b/ui/lib/gen/token/token.pb.dart new file mode 100644 index 0000000..df5f211 --- /dev/null +++ b/ui/lib/gen/token/token.pb.dart @@ -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 createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static AuthToken getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(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'); diff --git a/ui/lib/gen/token/token.pbenum.dart b/ui/lib/gen/token/token.pbenum.dart new file mode 100644 index 0000000..ca20d26 --- /dev/null +++ b/ui/lib/gen/token/token.pbenum.dart @@ -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 + diff --git a/ui/lib/gen/token/token.pbjson.dart b/ui/lib/gen/token/token.pbjson.dart new file mode 100644 index 0000000..376b888 --- /dev/null +++ b/ui/lib/gen/token/token.pbjson.dart @@ -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=='); + diff --git a/ui/lib/main.dart b/ui/lib/main.dart index 72bd99c..b9d4133 100644 --- a/ui/lib/main.dart +++ b/ui/lib/main.dart @@ -1,12 +1,30 @@ 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/gen/signaler_service.pbgrpc.dart'; +import 'package:ui/session_service.dart'; -void main() { - runApp(const MyApp()); +void main() async { + 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 { - 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. @override @@ -32,13 +50,22 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), + home: MyHomePage( + client, + sessionService, + title: 'Home Sensors', + home: "home1234", + ), ); } } 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 // 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 { - int _counter = 0; + String topMessage = "Creating session..."; + List camerasToRender = []; - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; + @override + void initState() { + super.initState(); + _getSession(); + _listCameras(); + } + + _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 @@ -87,18 +135,15 @@ class _MyHomePageState extends State { // the App.build method, and use it to set our appbar title. title: Text(widget.title), ), - body: const Center( + body: Column( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. - child: Call( - host: '', - ), + + children: [ + Text(topMessage), + ] + + camerasToRender, ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. ); } } diff --git a/ui/lib/session_service.dart b/ui/lib/session_service.dart new file mode 100644 index 0000000..d9188e4 --- /dev/null +++ b/ui/lib/session_service.dart @@ -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> _authTokens = {}; + + SessionService(this._stub); + + Future getAuthToken(String cameraID) async { + var val = await _authTokens.putIfAbsent(cameraID, + () => _stub.createAuthToken(CreateAuthTokenRequest(home: cameraID))); + return "Bearer ${val.token}"; + } +} diff --git a/ui/pubspec.lock b/ui/pubspec.lock index 1004c27..79650b9 100644 --- a/ui/pubspec.lock +++ b/ui/pubspec.lock @@ -1,6 +1,22 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile 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: dependency: transitive description: @@ -41,6 +57,22 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: "direct main" description: @@ -73,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + fixnum: + dependency: "direct main" + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -99,6 +139,46 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: @@ -227,6 +307,22 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: @@ -288,6 +384,14 @@ packages: url: "https://pub.dev" source: hosted 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: dependency: transitive description: diff --git a/ui/pubspec.yaml b/ui/pubspec.yaml index 71ee3a9..a6d019d 100644 --- a/ui/pubspec.yaml +++ b/ui/pubspec.yaml @@ -37,6 +37,9 @@ dependencies: cupertino_icons: ^1.0.2 flutter_webrtc: ^0.9.42+hotfix.1 logger: ^2.0.2 + protobuf: '>=2.0.0 <4.0.0' + grpc: ^3.2.4 + fixnum: ^1.1.0 dev_dependencies: flutter_test: