From 9bbe917e59af60b6194cd62fca3de24227ae5d31 Mon Sep 17 00:00:00 2001 From: Charles Hathaway Date: Wed, 20 Sep 2023 22:09:15 -0700 Subject: [PATCH] add: signal server --- buf.gen.yaml | 14 + buf.yaml | 7 + cmd/signaler/main.go | 29 +- cmd/watcher/main.go | 229 +++ gen/genconnect/signaler_service.connect.go | 347 +++++ gen/internal/token.pb.dart | 76 + gen/internal/token.pb.go | 159 ++ gen/internal/token.pbenum.dart | 11 + gen/internal/token.pbjson.dart | 28 + gen/internal/token.pbserver.dart | 14 + gen/signaler_service.pb.dart | 1241 +++++++++++++++ gen/signaler_service.pb.go | 1636 ++++++++++++++++++++ gen/signaler_service.pbenum.dart | 11 + gen/signaler_service.pbjson.dart | 338 ++++ gen/signaler_service.pbserver.dart | 67 + gen/token/token.pb.dart | 82 + gen/token/token.pb.go | 158 ++ gen/token/token.pbenum.dart | 11 + gen/token/token.pbjson.dart | 28 + gen/token/token.pbserver.dart | 14 + go.mod | 38 + go.sum | 259 ++++ pkg/signaler/signaler.go | 235 +++ proto/signaler_service.proto | 61 +- proto/token/token.proto | 7 + 25 files changed, 5097 insertions(+), 3 deletions(-) create mode 100644 buf.gen.yaml create mode 100644 buf.yaml create mode 100644 cmd/watcher/main.go create mode 100644 gen/genconnect/signaler_service.connect.go create mode 100644 gen/internal/token.pb.dart create mode 100644 gen/internal/token.pb.go create mode 100644 gen/internal/token.pbenum.dart create mode 100644 gen/internal/token.pbjson.dart create mode 100644 gen/internal/token.pbserver.dart create mode 100644 gen/signaler_service.pb.dart create mode 100644 gen/signaler_service.pb.go create mode 100644 gen/signaler_service.pbenum.dart create mode 100644 gen/signaler_service.pbjson.dart create mode 100644 gen/signaler_service.pbserver.dart create mode 100644 gen/token/token.pb.dart create mode 100644 gen/token/token.pb.go create mode 100644 gen/token/token.pbenum.dart create mode 100644 gen/token/token.pbjson.dart create mode 100644 gen/token/token.pbserver.dart create mode 100644 go.sum create mode 100644 pkg/signaler/signaler.go create mode 100644 proto/token/token.proto diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 0000000..f9f6d71 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,14 @@ +version: v1 +managed: + enabled: true + go_package_prefix: + default: github.com/chathaway-codes/home-sensors/v2/gen +plugins: + - plugin: buf.build/protocolbuffers/go + out: gen + opt: paths=source_relative + - 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 diff --git a/buf.yaml b/buf.yaml new file mode 100644 index 0000000..1a51945 --- /dev/null +++ b/buf.yaml @@ -0,0 +1,7 @@ +version: v1 +breaking: + use: + - FILE +lint: + use: + - DEFAULT diff --git a/cmd/signaler/main.go b/cmd/signaler/main.go index e354c43..d55d2df 100644 --- a/cmd/signaler/main.go +++ b/cmd/signaler/main.go @@ -1,7 +1,32 @@ package main -import "fmt" +import ( + "fmt" + "log" + "net/http" + + "connectrpc.com/grpcreflect" + servicepb "github.com/chathaway-codes/home-sensors/v2/gen/genconnect" + "github.com/chathaway-codes/home-sensors/v2/pkg/signaler" +) func main() { - fmt.Printf("Hello world!\n") + mux := http.NewServeMux() + reflector := grpcreflect.NewStaticReflector( + servicepb.SignalerServiceName, + ) + path, _ := grpcreflect.NewHandlerV1(reflector) + fmt.Printf("Got path %s\n", path) + mux.Handle(grpcreflect.NewHandlerV1(reflector)) + path, _ = grpcreflect.NewHandlerV1Alpha(reflector) + fmt.Printf("Got path %s\n", path) + mux.Handle(grpcreflect.NewHandlerV1Alpha(reflector)) + + path, _ = servicepb.NewSignalerServiceHandler(signaler.New()) + 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 { + log.Fatalf("Failed to listen for HTTP traffic: %v", err) + } } diff --git a/cmd/watcher/main.go b/cmd/watcher/main.go new file mode 100644 index 0000000..61d5c95 --- /dev/null +++ b/cmd/watcher/main.go @@ -0,0 +1,229 @@ +//go:build !js +// +build !js + +package main + +import ( + "context" + "fmt" + "io" + "log" + "net/http" + "os" + "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/pion/webrtc/v3" + "github.com/pion/webrtc/v3/pkg/media" + "github.com/pion/webrtc/v3/pkg/media/h264reader" + "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 +) + +func main() { //nolint + ctx := context.Background() + client := servicepb.NewSignalerServiceClient(&http.Client{}, "http://localhost:8080/") + // Assert that we have an audio or video file + _, err := os.Stat(videoFileName) + haveVideoFile := !os.IsNotExist(err) + + // Create a new RTCPeerConnection + peerConnection, err := webrtc.NewPeerConnection(webrtc.Configuration{ + ICEServers: []webrtc.ICEServer{ + { + URLs: []string{"stun:stun.l.google.com:19302"}, + }, + }, + }) + if err != nil { + panic(err) + } + defer func() { + if cErr := peerConnection.Close(); cErr != nil { + fmt.Printf("cannot close peerConnection: %v\n", cErr) + } + }() + + iceConnectedCtx, iceConnectedCtxCancel := context.WithCancel(context.Background()) + + 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) + } + } + }() + } + + // Set the handler for ICE connection state + // This will notify you when the peer has connected/disconnected + peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { + fmt.Printf("Connection State has changed %s \n", connectionState.String()) + if connectionState == webrtc.ICEConnectionStateConnected { + iceConnectedCtxCancel() + } + }) + + // Set the handler for Peer connection state + // This will notify you when the peer has connected/disconnected + peerConnection.OnConnectionStateChange(func(s webrtc.PeerConnectionState) { + fmt.Printf("Peer Connection State has changed: %s\n", s.String()) + + if s == webrtc.PeerConnectionStateFailed { + // Wait until PeerConnection has had no network activity for 30 seconds or another failure. It may be reconnected using an ICE Restart. + // 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) + } + }) + + var iceCandidates []*pb.IceCandidate + peerConnection.OnICECandidate(func(i *webrtc.ICECandidate) { + if i == nil { + return + } + c := i.ToJSON() + iceCandidates = append(iceCandidates, &pb.IceCandidate{ + Candidate: c.Candidate, + SdpMid: c.SDPMid, + SdpLineIndex: proto.Int32(int32(*c.SDPMLineIndex)), + UsernameFragment: proto.String(*c.UsernameFragment), + }) + }) + + // Wait for a session request + var session *pb.Session + for session == nil { + resp, err := client.ListSessions(ctx, connect.NewRequest(&pb.ListSessionsRequest{})) + if err != nil { + log.Fatalf("error creating session: %v", err) + } + if len(resp.Msg.Sessions) > 0 { + session = resp.Msg.Sessions[0] + } + time.Sleep(time.Millisecond * 500) + } + + // Add ICE candidates from remote + for _, candidate := range session.GetClientIceCandidates() { + var sdpMLine *uint16 + if candidate.SdpLineIndex != nil { + t := uint16(candidate.GetSdpLineIndex()) + sdpMLine = &t + } + peerConnection.AddICECandidate(webrtc.ICECandidateInit{ + Candidate: candidate.GetCandidate(), + SDPMid: candidate.SdpMid, + SDPMLineIndex: sdpMLine, + }) + } + + cameraOffer, err := peerConnection.CreateOffer(nil) + if err != nil { + log.Fatalf("error creating session: %v", err) + } + + // Set the remote SessionDescription + if err = peerConnection.SetRemoteDescription(cameraOffer); err != nil { + panic(err) + } + + // Create channel that is blocked until ICE Gathering is complete + gatherComplete := webrtc.GatheringCompletePromise(peerConnection) + // Block until ICE Gathering is complete, disabling trickle ICE + // we do this because we only can exchange one signaling message + // in a production application you should exchange ICE Candidates via OnICECandidate + log.Printf("Waiting to gather ICE") + <-gatherComplete + log.Printf("Done gathering ICE") + + session.CameraIceCandidates = iceCandidates + session.CameraOffer = &pb.IceSessionDescription{ + SdpType: int64(cameraOffer.Type), + Sdp: cameraOffer.SDP, + } + + // Send it back + resp, err := client.UpdateSession(ctx, connect.NewRequest(&pb.UpdateSessionRequest{ + Session: session, + WaitForUpdate: true, + })) + if err != nil { + log.Fatalf("error creating session: %v", err) + } + + answer := webrtc.SessionDescription{ + Type: webrtc.SDPType(resp.Msg.ClientAnswer.SdpType), + SDP: resp.Msg.ClientAnswer.Sdp, + } + + // Sets the LocalDescription, and starts our UDP listeners + if err = peerConnection.SetLocalDescription(answer); err != nil { + panic(err) + } + + // Block forever + select {} +} diff --git a/gen/genconnect/signaler_service.connect.go b/gen/genconnect/signaler_service.connect.go new file mode 100644 index 0000000..9344672 --- /dev/null +++ b/gen/genconnect/signaler_service.connect.go @@ -0,0 +1,347 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: signaler_service.proto + +package genconnect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + gen "github.com/chathaway-codes/home-sensors/v2/gen" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion0_1_0 + +const ( + // SignalerServiceName is the fully-qualified name of the SignalerService service. + SignalerServiceName = "signaler.SignalerService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SignalerServiceCreateAuthTokenProcedure is the fully-qualified name of the SignalerService's + // CreateAuthToken RPC. + SignalerServiceCreateAuthTokenProcedure = "/signaler.SignalerService/CreateAuthToken" + // SignalerServiceListCamerasProcedure is the fully-qualified name of the SignalerService's + // ListCameras RPC. + SignalerServiceListCamerasProcedure = "/signaler.SignalerService/ListCameras" + // SignalerServiceCreateSessionProcedure is the fully-qualified name of the SignalerService's + // CreateSession RPC. + SignalerServiceCreateSessionProcedure = "/signaler.SignalerService/CreateSession" + // SignalerServiceUpdateSessionProcedure is the fully-qualified name of the SignalerService's + // UpdateSession RPC. + SignalerServiceUpdateSessionProcedure = "/signaler.SignalerService/UpdateSession" + // SignalerServiceListSessionsProcedure is the fully-qualified name of the SignalerService's + // ListSessions RPC. + SignalerServiceListSessionsProcedure = "/signaler.SignalerService/ListSessions" + // SignalerServiceCreateIceCandidateProcedure is the fully-qualified name of the SignalerService's + // CreateIceCandidate RPC. + SignalerServiceCreateIceCandidateProcedure = "/signaler.SignalerService/CreateIceCandidate" + // SignalerServicePopIceCandidateProcedure is the fully-qualified name of the SignalerService's + // PopIceCandidate RPC. + SignalerServicePopIceCandidateProcedure = "/signaler.SignalerService/PopIceCandidate" + // SignalerServiceCreateIceSessionDescriptionProcedure is the fully-qualified name of the + // SignalerService's CreateIceSessionDescription RPC. + SignalerServiceCreateIceSessionDescriptionProcedure = "/signaler.SignalerService/CreateIceSessionDescription" + // SignalerServicePopIceSessionDescriptionProcedure is the fully-qualified name of the + // SignalerService's PopIceSessionDescription RPC. + SignalerServicePopIceSessionDescriptionProcedure = "/signaler.SignalerService/PopIceSessionDescription" +) + +// SignalerServiceClient is a client for the signaler.SignalerService service. +type SignalerServiceClient interface { + CreateAuthToken(context.Context, *connect.Request[gen.CreateAuthTokenRequest]) (*connect.Response[gen.AuthToken], error) + ListCameras(context.Context, *connect.Request[gen.ListCamerasRequest]) (*connect.Response[gen.ListCamerasResponse], error) + // CreateSession creates a new session that can be seen bv the provided Camera and Peer. + // + // 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. + CreateSession(context.Context, *connect.Request[gen.CreateSessionRequest]) (*connect.Response[gen.Session], error) + // UpdateSession updates the session + UpdateSession(context.Context, *connect.Request[gen.UpdateSessionRequest]) (*connect.Response[gen.Session], error) + // ListSessions lists all sessions the client should consider. + // + // TODO: it would be better if we could alert a camera to poll for sessions + // i.e., with websockets (or streaming RPCs). + ListSessions(context.Context, *connect.Request[gen.ListSessionsRequest]) (*connect.Response[gen.ListSessionsResponse], error) + // CreateIceCandidate adds the provided candidate to the list of candidates. + CreateIceCandidate(context.Context, *connect.Request[gen.CreateIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) + // PopIceCandidate delete a candidate from the list of candidates and returns it. + // + // If there are no candidates, this blocks until one becomes available. + PopIceCandidate(context.Context, *connect.Request[gen.PopIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) + CreateIceSessionDescription(context.Context, *connect.Request[gen.CreateIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) + PopIceSessionDescription(context.Context, *connect.Request[gen.PopIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) +} + +// NewSignalerServiceClient constructs a client for the signaler.SignalerService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSignalerServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SignalerServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &signalerServiceClient{ + createAuthToken: connect.NewClient[gen.CreateAuthTokenRequest, gen.AuthToken]( + httpClient, + baseURL+SignalerServiceCreateAuthTokenProcedure, + opts..., + ), + listCameras: connect.NewClient[gen.ListCamerasRequest, gen.ListCamerasResponse]( + httpClient, + baseURL+SignalerServiceListCamerasProcedure, + opts..., + ), + createSession: connect.NewClient[gen.CreateSessionRequest, gen.Session]( + httpClient, + baseURL+SignalerServiceCreateSessionProcedure, + opts..., + ), + updateSession: connect.NewClient[gen.UpdateSessionRequest, gen.Session]( + httpClient, + baseURL+SignalerServiceUpdateSessionProcedure, + opts..., + ), + listSessions: connect.NewClient[gen.ListSessionsRequest, gen.ListSessionsResponse]( + httpClient, + baseURL+SignalerServiceListSessionsProcedure, + opts..., + ), + createIceCandidate: connect.NewClient[gen.CreateIceCandidateRequest, gen.IceCandidate]( + httpClient, + baseURL+SignalerServiceCreateIceCandidateProcedure, + opts..., + ), + popIceCandidate: connect.NewClient[gen.PopIceCandidateRequest, gen.IceCandidate]( + httpClient, + baseURL+SignalerServicePopIceCandidateProcedure, + opts..., + ), + createIceSessionDescription: connect.NewClient[gen.CreateIceSessionDescriptionRequest, gen.IceSessionDescription]( + httpClient, + baseURL+SignalerServiceCreateIceSessionDescriptionProcedure, + opts..., + ), + popIceSessionDescription: connect.NewClient[gen.PopIceSessionDescriptionRequest, gen.IceSessionDescription]( + httpClient, + baseURL+SignalerServicePopIceSessionDescriptionProcedure, + opts..., + ), + } +} + +// signalerServiceClient implements SignalerServiceClient. +type signalerServiceClient struct { + createAuthToken *connect.Client[gen.CreateAuthTokenRequest, gen.AuthToken] + listCameras *connect.Client[gen.ListCamerasRequest, gen.ListCamerasResponse] + createSession *connect.Client[gen.CreateSessionRequest, gen.Session] + updateSession *connect.Client[gen.UpdateSessionRequest, gen.Session] + listSessions *connect.Client[gen.ListSessionsRequest, gen.ListSessionsResponse] + createIceCandidate *connect.Client[gen.CreateIceCandidateRequest, gen.IceCandidate] + popIceCandidate *connect.Client[gen.PopIceCandidateRequest, gen.IceCandidate] + createIceSessionDescription *connect.Client[gen.CreateIceSessionDescriptionRequest, gen.IceSessionDescription] + popIceSessionDescription *connect.Client[gen.PopIceSessionDescriptionRequest, gen.IceSessionDescription] +} + +// CreateAuthToken calls signaler.SignalerService.CreateAuthToken. +func (c *signalerServiceClient) CreateAuthToken(ctx context.Context, req *connect.Request[gen.CreateAuthTokenRequest]) (*connect.Response[gen.AuthToken], error) { + return c.createAuthToken.CallUnary(ctx, req) +} + +// ListCameras calls signaler.SignalerService.ListCameras. +func (c *signalerServiceClient) ListCameras(ctx context.Context, req *connect.Request[gen.ListCamerasRequest]) (*connect.Response[gen.ListCamerasResponse], error) { + return c.listCameras.CallUnary(ctx, req) +} + +// CreateSession calls signaler.SignalerService.CreateSession. +func (c *signalerServiceClient) CreateSession(ctx context.Context, req *connect.Request[gen.CreateSessionRequest]) (*connect.Response[gen.Session], error) { + return c.createSession.CallUnary(ctx, req) +} + +// UpdateSession calls signaler.SignalerService.UpdateSession. +func (c *signalerServiceClient) UpdateSession(ctx context.Context, req *connect.Request[gen.UpdateSessionRequest]) (*connect.Response[gen.Session], error) { + return c.updateSession.CallUnary(ctx, req) +} + +// ListSessions calls signaler.SignalerService.ListSessions. +func (c *signalerServiceClient) ListSessions(ctx context.Context, req *connect.Request[gen.ListSessionsRequest]) (*connect.Response[gen.ListSessionsResponse], error) { + return c.listSessions.CallUnary(ctx, req) +} + +// CreateIceCandidate calls signaler.SignalerService.CreateIceCandidate. +func (c *signalerServiceClient) CreateIceCandidate(ctx context.Context, req *connect.Request[gen.CreateIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) { + return c.createIceCandidate.CallUnary(ctx, req) +} + +// PopIceCandidate calls signaler.SignalerService.PopIceCandidate. +func (c *signalerServiceClient) PopIceCandidate(ctx context.Context, req *connect.Request[gen.PopIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) { + return c.popIceCandidate.CallUnary(ctx, req) +} + +// CreateIceSessionDescription calls signaler.SignalerService.CreateIceSessionDescription. +func (c *signalerServiceClient) CreateIceSessionDescription(ctx context.Context, req *connect.Request[gen.CreateIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) { + return c.createIceSessionDescription.CallUnary(ctx, req) +} + +// PopIceSessionDescription calls signaler.SignalerService.PopIceSessionDescription. +func (c *signalerServiceClient) PopIceSessionDescription(ctx context.Context, req *connect.Request[gen.PopIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) { + return c.popIceSessionDescription.CallUnary(ctx, req) +} + +// SignalerServiceHandler is an implementation of the signaler.SignalerService service. +type SignalerServiceHandler interface { + CreateAuthToken(context.Context, *connect.Request[gen.CreateAuthTokenRequest]) (*connect.Response[gen.AuthToken], error) + ListCameras(context.Context, *connect.Request[gen.ListCamerasRequest]) (*connect.Response[gen.ListCamerasResponse], error) + // CreateSession creates a new session that can be seen bv the provided Camera and Peer. + // + // 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. + CreateSession(context.Context, *connect.Request[gen.CreateSessionRequest]) (*connect.Response[gen.Session], error) + // UpdateSession updates the session + UpdateSession(context.Context, *connect.Request[gen.UpdateSessionRequest]) (*connect.Response[gen.Session], error) + // ListSessions lists all sessions the client should consider. + // + // TODO: it would be better if we could alert a camera to poll for sessions + // i.e., with websockets (or streaming RPCs). + ListSessions(context.Context, *connect.Request[gen.ListSessionsRequest]) (*connect.Response[gen.ListSessionsResponse], error) + // CreateIceCandidate adds the provided candidate to the list of candidates. + CreateIceCandidate(context.Context, *connect.Request[gen.CreateIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) + // PopIceCandidate delete a candidate from the list of candidates and returns it. + // + // If there are no candidates, this blocks until one becomes available. + PopIceCandidate(context.Context, *connect.Request[gen.PopIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) + CreateIceSessionDescription(context.Context, *connect.Request[gen.CreateIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) + PopIceSessionDescription(context.Context, *connect.Request[gen.PopIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) +} + +// NewSignalerServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSignalerServiceHandler(svc SignalerServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + signalerServiceCreateAuthTokenHandler := connect.NewUnaryHandler( + SignalerServiceCreateAuthTokenProcedure, + svc.CreateAuthToken, + opts..., + ) + signalerServiceListCamerasHandler := connect.NewUnaryHandler( + SignalerServiceListCamerasProcedure, + svc.ListCameras, + opts..., + ) + signalerServiceCreateSessionHandler := connect.NewUnaryHandler( + SignalerServiceCreateSessionProcedure, + svc.CreateSession, + opts..., + ) + signalerServiceUpdateSessionHandler := connect.NewUnaryHandler( + SignalerServiceUpdateSessionProcedure, + svc.UpdateSession, + opts..., + ) + signalerServiceListSessionsHandler := connect.NewUnaryHandler( + SignalerServiceListSessionsProcedure, + svc.ListSessions, + opts..., + ) + signalerServiceCreateIceCandidateHandler := connect.NewUnaryHandler( + SignalerServiceCreateIceCandidateProcedure, + svc.CreateIceCandidate, + opts..., + ) + signalerServicePopIceCandidateHandler := connect.NewUnaryHandler( + SignalerServicePopIceCandidateProcedure, + svc.PopIceCandidate, + opts..., + ) + signalerServiceCreateIceSessionDescriptionHandler := connect.NewUnaryHandler( + SignalerServiceCreateIceSessionDescriptionProcedure, + svc.CreateIceSessionDescription, + opts..., + ) + signalerServicePopIceSessionDescriptionHandler := connect.NewUnaryHandler( + SignalerServicePopIceSessionDescriptionProcedure, + svc.PopIceSessionDescription, + opts..., + ) + return "/signaler.SignalerService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SignalerServiceCreateAuthTokenProcedure: + signalerServiceCreateAuthTokenHandler.ServeHTTP(w, r) + case SignalerServiceListCamerasProcedure: + signalerServiceListCamerasHandler.ServeHTTP(w, r) + case SignalerServiceCreateSessionProcedure: + signalerServiceCreateSessionHandler.ServeHTTP(w, r) + case SignalerServiceUpdateSessionProcedure: + signalerServiceUpdateSessionHandler.ServeHTTP(w, r) + case SignalerServiceListSessionsProcedure: + signalerServiceListSessionsHandler.ServeHTTP(w, r) + case SignalerServiceCreateIceCandidateProcedure: + signalerServiceCreateIceCandidateHandler.ServeHTTP(w, r) + case SignalerServicePopIceCandidateProcedure: + signalerServicePopIceCandidateHandler.ServeHTTP(w, r) + case SignalerServiceCreateIceSessionDescriptionProcedure: + signalerServiceCreateIceSessionDescriptionHandler.ServeHTTP(w, r) + case SignalerServicePopIceSessionDescriptionProcedure: + signalerServicePopIceSessionDescriptionHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSignalerServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSignalerServiceHandler struct{} + +func (UnimplementedSignalerServiceHandler) CreateAuthToken(context.Context, *connect.Request[gen.CreateAuthTokenRequest]) (*connect.Response[gen.AuthToken], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.CreateAuthToken is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) ListCameras(context.Context, *connect.Request[gen.ListCamerasRequest]) (*connect.Response[gen.ListCamerasResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.ListCameras is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) CreateSession(context.Context, *connect.Request[gen.CreateSessionRequest]) (*connect.Response[gen.Session], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.CreateSession is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) UpdateSession(context.Context, *connect.Request[gen.UpdateSessionRequest]) (*connect.Response[gen.Session], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.UpdateSession is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) ListSessions(context.Context, *connect.Request[gen.ListSessionsRequest]) (*connect.Response[gen.ListSessionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.ListSessions is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) CreateIceCandidate(context.Context, *connect.Request[gen.CreateIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.CreateIceCandidate is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) PopIceCandidate(context.Context, *connect.Request[gen.PopIceCandidateRequest]) (*connect.Response[gen.IceCandidate], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.PopIceCandidate is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) CreateIceSessionDescription(context.Context, *connect.Request[gen.CreateIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.CreateIceSessionDescription is not implemented")) +} + +func (UnimplementedSignalerServiceHandler) PopIceSessionDescription(context.Context, *connect.Request[gen.PopIceSessionDescriptionRequest]) (*connect.Response[gen.IceSessionDescription], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("signaler.SignalerService.PopIceSessionDescription is not implemented")) +} diff --git a/gen/internal/token.pb.dart b/gen/internal/token.pb.dart new file mode 100644 index 0000000..1c5f409 --- /dev/null +++ b/gen/internal/token.pb.dart @@ -0,0 +1,76 @@ +// +// Generated code. Do not modify. +// source: internal/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.Iterable<$core.String>? homes, + }) { + final $result = create(); + if (uid != null) { + $result.uid = uid; + } + if (homes != null) { + $result.homes.addAll(homes); + } + 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') + ..pPS(2, _omitFieldNames ? '' : 'homes') + ..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.List<$core.String> get homes => $_getList(1); +} + + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/gen/internal/token.pb.go b/gen/internal/token.pb.go new file mode 100644 index 0000000..b6f068f --- /dev/null +++ b/gen/internal/token.pb.go @@ -0,0 +1,159 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: internal/token.proto + +package internal + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AuthToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + Homes []string `protobuf:"bytes,2,rep,name=homes,proto3" json:"homes,omitempty"` +} + +func (x *AuthToken) Reset() { + *x = AuthToken{} + if protoimpl.UnsafeEnabled { + mi := &file_internal_token_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthToken) ProtoMessage() {} + +func (x *AuthToken) ProtoReflect() protoreflect.Message { + mi := &file_internal_token_proto_msgTypes[0] + 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 AuthToken.ProtoReflect.Descriptor instead. +func (*AuthToken) Descriptor() ([]byte, []int) { + return file_internal_token_proto_rawDescGZIP(), []int{0} +} + +func (x *AuthToken) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *AuthToken) GetHomes() []string { + if x != nil { + return x.Homes + } + return nil +} + +var File_internal_token_proto protoreflect.FileDescriptor + +var file_internal_token_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x33, 0x0a, + 0x09, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x6d, + 0x65, 0x73, 0x42, 0x84, 0x01, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x42, 0x0a, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x37, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x68, + 0x61, 0x77, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2d, + 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0xa2, 0x02, 0x03, 0x54, 0x58, 0x58, 0xaa, 0x02, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0xca, 0x02, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0xe2, 0x02, 0x11, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_internal_token_proto_rawDescOnce sync.Once + file_internal_token_proto_rawDescData = file_internal_token_proto_rawDesc +) + +func file_internal_token_proto_rawDescGZIP() []byte { + file_internal_token_proto_rawDescOnce.Do(func() { + file_internal_token_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_token_proto_rawDescData) + }) + return file_internal_token_proto_rawDescData +} + +var file_internal_token_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_internal_token_proto_goTypes = []interface{}{ + (*AuthToken)(nil), // 0: token.AuthToken +} +var file_internal_token_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_internal_token_proto_init() } +func file_internal_token_proto_init() { + if File_internal_token_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_internal_token_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_internal_token_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_internal_token_proto_goTypes, + DependencyIndexes: file_internal_token_proto_depIdxs, + MessageInfos: file_internal_token_proto_msgTypes, + }.Build() + File_internal_token_proto = out.File + file_internal_token_proto_rawDesc = nil + file_internal_token_proto_goTypes = nil + file_internal_token_proto_depIdxs = nil +} diff --git a/gen/internal/token.pbenum.dart b/gen/internal/token.pbenum.dart new file mode 100644 index 0000000..6c170f5 --- /dev/null +++ b/gen/internal/token.pbenum.dart @@ -0,0 +1,11 @@ +// +// Generated code. Do not modify. +// source: internal/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/gen/internal/token.pbjson.dart b/gen/internal/token.pbjson.dart new file mode 100644 index 0000000..60a799a --- /dev/null +++ b/gen/internal/token.pbjson.dart @@ -0,0 +1,28 @@ +// +// Generated code. Do not modify. +// source: internal/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': 'homes', '3': 2, '4': 3, '5': 9, '10': 'homes'}, + ], +}; + +/// Descriptor for `AuthToken`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List authTokenDescriptor = $convert.base64Decode( + 'CglBdXRoVG9rZW4SEAoDdWlkGAEgASgJUgN1aWQSFAoFaG9tZXMYAiADKAlSBWhvbWVz'); + diff --git a/gen/internal/token.pbserver.dart b/gen/internal/token.pbserver.dart new file mode 100644 index 0000000..9542bed --- /dev/null +++ b/gen/internal/token.pbserver.dart @@ -0,0 +1,14 @@ +// +// Generated code. Do not modify. +// source: internal/token.proto +// +// @dart = 2.12 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +export 'token.pb.dart'; + diff --git a/gen/signaler_service.pb.dart b/gen/signaler_service.pb.dart new file mode 100644 index 0000000..287acca --- /dev/null +++ b/gen/signaler_service.pb.dart @@ -0,0 +1,1241 @@ +// +// 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: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 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 CreateIceCandidateRequest extends $pb.GeneratedMessage { + factory CreateIceCandidateRequest({ + Session_Identifier? sessionIdentifier, + IceCandidate? candidate, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + if (candidate != null) { + $result.candidate = candidate; + } + return $result; + } + CreateIceCandidateRequest._() : super(); + factory CreateIceCandidateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateIceCandidateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateIceCandidateRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'sessionIdentifier', subBuilder: Session_Identifier.create) + ..aOM(2, _omitFieldNames ? '' : 'candidate', subBuilder: IceCandidate.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') + CreateIceCandidateRequest clone() => CreateIceCandidateRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateIceCandidateRequest copyWith(void Function(CreateIceCandidateRequest) updates) => super.copyWith((message) => updates(message as CreateIceCandidateRequest)) as CreateIceCandidateRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateIceCandidateRequest create() => CreateIceCandidateRequest._(); + CreateIceCandidateRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateIceCandidateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateIceCandidateRequest? _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) + IceCandidate get candidate => $_getN(1); + @$pb.TagNumber(2) + set candidate(IceCandidate v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasCandidate() => $_has(1); + @$pb.TagNumber(2) + void clearCandidate() => clearField(2); + @$pb.TagNumber(2) + IceCandidate ensureCandidate() => $_ensure(1); +} + +class PopIceCandidateRequest extends $pb.GeneratedMessage { + factory PopIceCandidateRequest({ + Session_Identifier? sessionIdentifier, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + return $result; + } + PopIceCandidateRequest._() : super(); + factory PopIceCandidateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PopIceCandidateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PopIceCandidateRequest', 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') + PopIceCandidateRequest clone() => PopIceCandidateRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PopIceCandidateRequest copyWith(void Function(PopIceCandidateRequest) updates) => super.copyWith((message) => updates(message as PopIceCandidateRequest)) as PopIceCandidateRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PopIceCandidateRequest create() => PopIceCandidateRequest._(); + PopIceCandidateRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PopIceCandidateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PopIceCandidateRequest? _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 CreateIceSessionDescriptionRequest extends $pb.GeneratedMessage { + factory CreateIceSessionDescriptionRequest({ + Session_Identifier? sessionIdentifier, + IceSessionDescription? description, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + if (description != null) { + $result.description = description; + } + return $result; + } + CreateIceSessionDescriptionRequest._() : super(); + factory CreateIceSessionDescriptionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CreateIceSessionDescriptionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateIceSessionDescriptionRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'signaler'), createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'sessionIdentifier', subBuilder: Session_Identifier.create) + ..aOM(2, _omitFieldNames ? '' : 'description', subBuilder: IceSessionDescription.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') + CreateIceSessionDescriptionRequest clone() => CreateIceSessionDescriptionRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CreateIceSessionDescriptionRequest copyWith(void Function(CreateIceSessionDescriptionRequest) updates) => super.copyWith((message) => updates(message as CreateIceSessionDescriptionRequest)) as CreateIceSessionDescriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CreateIceSessionDescriptionRequest create() => CreateIceSessionDescriptionRequest._(); + CreateIceSessionDescriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CreateIceSessionDescriptionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CreateIceSessionDescriptionRequest? _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) + IceSessionDescription get description => $_getN(1); + @$pb.TagNumber(2) + set description(IceSessionDescription v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasDescription() => $_has(1); + @$pb.TagNumber(2) + void clearDescription() => clearField(2); + @$pb.TagNumber(2) + IceSessionDescription ensureDescription() => $_ensure(1); +} + +class PopIceSessionDescriptionRequest extends $pb.GeneratedMessage { + factory PopIceSessionDescriptionRequest({ + Session_Identifier? sessionIdentifier, + }) { + final $result = create(); + if (sessionIdentifier != null) { + $result.sessionIdentifier = sessionIdentifier; + } + return $result; + } + PopIceSessionDescriptionRequest._() : super(); + factory PopIceSessionDescriptionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PopIceSessionDescriptionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PopIceSessionDescriptionRequest', 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') + PopIceSessionDescriptionRequest clone() => PopIceSessionDescriptionRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PopIceSessionDescriptionRequest copyWith(void Function(PopIceSessionDescriptionRequest) updates) => super.copyWith((message) => updates(message as PopIceSessionDescriptionRequest)) as PopIceSessionDescriptionRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PopIceSessionDescriptionRequest create() => PopIceSessionDescriptionRequest._(); + PopIceSessionDescriptionRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PopIceSessionDescriptionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PopIceSessionDescriptionRequest? _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); +} + +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, + $core.Iterable? clientIceCandidates, + $core.Iterable? cameraIceCandidates, + IceSessionDescription? cameraOffer, + IceSessionDescription? clientAnswer, + }) { + final $result = create(); + if (id != null) { + $result.id = id; + } + if (camera != null) { + $result.camera = camera; + } + if (clientIceCandidates != null) { + $result.clientIceCandidates.addAll(clientIceCandidates); + } + if (cameraIceCandidates != null) { + $result.cameraIceCandidates.addAll(cameraIceCandidates); + } + if (cameraOffer != null) { + $result.cameraOffer = cameraOffer; + } + if (clientAnswer != null) { + $result.clientAnswer = clientAnswer; + } + 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) + ..pc(3, _omitFieldNames ? '' : 'clientIceCandidates', $pb.PbFieldType.PM, subBuilder: IceCandidate.create) + ..pc(4, _omitFieldNames ? '' : 'cameraIceCandidates', $pb.PbFieldType.PM, subBuilder: IceCandidate.create) + ..aOM(5, _omitFieldNames ? '' : 'cameraOffer', subBuilder: IceSessionDescription.create) + ..aOM(6, _omitFieldNames ? '' : 'clientAnswer', subBuilder: IceSessionDescription.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); + + @$pb.TagNumber(3) + $core.List get clientIceCandidates => $_getList(2); + + @$pb.TagNumber(4) + $core.List get cameraIceCandidates => $_getList(3); + + @$pb.TagNumber(5) + IceSessionDescription get cameraOffer => $_getN(4); + @$pb.TagNumber(5) + set cameraOffer(IceSessionDescription v) { setField(5, v); } + @$pb.TagNumber(5) + $core.bool hasCameraOffer() => $_has(4); + @$pb.TagNumber(5) + void clearCameraOffer() => clearField(5); + @$pb.TagNumber(5) + IceSessionDescription ensureCameraOffer() => $_ensure(4); + + @$pb.TagNumber(6) + IceSessionDescription get clientAnswer => $_getN(5); + @$pb.TagNumber(6) + set clientAnswer(IceSessionDescription v) { setField(6, v); } + @$pb.TagNumber(6) + $core.bool hasClientAnswer() => $_has(5); + @$pb.TagNumber(6) + void clearClientAnswer() => clearField(6); + @$pb.TagNumber(6) + IceSessionDescription ensureClientAnswer() => $_ensure(5); +} + +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); +} + +class SignalerServiceApi { + $pb.RpcClient _client; + SignalerServiceApi(this._client); + + $async.Future createAuthToken($pb.ClientContext? ctx, CreateAuthTokenRequest request) => + _client.invoke(ctx, 'SignalerService', 'CreateAuthToken', request, AuthToken()) + ; + $async.Future listCameras($pb.ClientContext? ctx, ListCamerasRequest request) => + _client.invoke(ctx, 'SignalerService', 'ListCameras', request, ListCamerasResponse()) + ; + $async.Future createSession($pb.ClientContext? ctx, CreateSessionRequest request) => + _client.invoke(ctx, 'SignalerService', 'CreateSession', request, Session()) + ; + $async.Future updateSession($pb.ClientContext? ctx, UpdateSessionRequest request) => + _client.invoke(ctx, 'SignalerService', 'UpdateSession', request, Session()) + ; + $async.Future listSessions($pb.ClientContext? ctx, ListSessionsRequest request) => + _client.invoke(ctx, 'SignalerService', 'ListSessions', request, ListSessionsResponse()) + ; + $async.Future createIceCandidate($pb.ClientContext? ctx, CreateIceCandidateRequest request) => + _client.invoke(ctx, 'SignalerService', 'CreateIceCandidate', request, IceCandidate()) + ; + $async.Future popIceCandidate($pb.ClientContext? ctx, PopIceCandidateRequest request) => + _client.invoke(ctx, 'SignalerService', 'PopIceCandidate', request, IceCandidate()) + ; + $async.Future createIceSessionDescription($pb.ClientContext? ctx, CreateIceSessionDescriptionRequest request) => + _client.invoke(ctx, 'SignalerService', 'CreateIceSessionDescription', request, IceSessionDescription()) + ; + $async.Future popIceSessionDescription($pb.ClientContext? ctx, PopIceSessionDescriptionRequest request) => + _client.invoke(ctx, 'SignalerService', 'PopIceSessionDescription', request, IceSessionDescription()) + ; +} + + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/gen/signaler_service.pb.go b/gen/signaler_service.pb.go new file mode 100644 index 0000000..0b90513 --- /dev/null +++ b/gen/signaler_service.pb.go @@ -0,0 +1,1636 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: signaler_service.proto + +package gen + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type CreateAuthTokenRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Homes this auth token should be registered too. + Home string `protobuf:"bytes,1,opt,name=home,proto3" json:"home,omitempty"` + // Types that are assignable to Type: + // + // *CreateAuthTokenRequest_Camera_ + // *CreateAuthTokenRequest_Client_ + Type isCreateAuthTokenRequest_Type `protobuf_oneof:"type"` +} + +func (x *CreateAuthTokenRequest) Reset() { + *x = CreateAuthTokenRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAuthTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAuthTokenRequest) ProtoMessage() {} + +func (x *CreateAuthTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[0] + 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 CreateAuthTokenRequest.ProtoReflect.Descriptor instead. +func (*CreateAuthTokenRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateAuthTokenRequest) GetHome() string { + if x != nil { + return x.Home + } + return "" +} + +func (m *CreateAuthTokenRequest) GetType() isCreateAuthTokenRequest_Type { + if m != nil { + return m.Type + } + return nil +} + +func (x *CreateAuthTokenRequest) GetCamera() *CreateAuthTokenRequest_Camera { + if x, ok := x.GetType().(*CreateAuthTokenRequest_Camera_); ok { + return x.Camera + } + return nil +} + +func (x *CreateAuthTokenRequest) GetClient() *CreateAuthTokenRequest_Client { + if x, ok := x.GetType().(*CreateAuthTokenRequest_Client_); ok { + return x.Client + } + return nil +} + +type isCreateAuthTokenRequest_Type interface { + isCreateAuthTokenRequest_Type() +} + +type CreateAuthTokenRequest_Camera_ struct { + Camera *CreateAuthTokenRequest_Camera `protobuf:"bytes,2,opt,name=camera,proto3,oneof"` +} + +type CreateAuthTokenRequest_Client_ struct { + Client *CreateAuthTokenRequest_Client `protobuf:"bytes,3,opt,name=client,proto3,oneof"` +} + +func (*CreateAuthTokenRequest_Camera_) isCreateAuthTokenRequest_Type() {} + +func (*CreateAuthTokenRequest_Client_) isCreateAuthTokenRequest_Type() {} + +type ListCamerasRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ListCamerasRequest) Reset() { + *x = ListCamerasRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListCamerasRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCamerasRequest) ProtoMessage() {} + +func (x *ListCamerasRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[1] + 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 ListCamerasRequest.ProtoReflect.Descriptor instead. +func (*ListCamerasRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{1} +} + +type ListCamerasResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cameras []*Camera `protobuf:"bytes,1,rep,name=cameras,proto3" json:"cameras,omitempty"` +} + +func (x *ListCamerasResponse) Reset() { + *x = ListCamerasResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListCamerasResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCamerasResponse) ProtoMessage() {} + +func (x *ListCamerasResponse) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[2] + 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 ListCamerasResponse.ProtoReflect.Descriptor instead. +func (*ListCamerasResponse) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{2} +} + +func (x *ListCamerasResponse) GetCameras() []*Camera { + if x != nil { + return x.Cameras + } + return nil +} + +type CreateSessionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Session *Session `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` + // 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. + WaitForUpdate bool `protobuf:"varint,2,opt,name=wait_for_update,json=waitForUpdate,proto3" json:"wait_for_update,omitempty"` +} + +func (x *CreateSessionRequest) Reset() { + *x = CreateSessionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSessionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSessionRequest) ProtoMessage() {} + +func (x *CreateSessionRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[3] + 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 CreateSessionRequest.ProtoReflect.Descriptor instead. +func (*CreateSessionRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateSessionRequest) GetSession() *Session { + if x != nil { + return x.Session + } + return nil +} + +func (x *CreateSessionRequest) GetWaitForUpdate() bool { + if x != nil { + return x.WaitForUpdate + } + return false +} + +type UpdateSessionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Session *Session `protobuf:"bytes,1,opt,name=session,proto3" json:"session,omitempty"` + // 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. + WaitForUpdate bool `protobuf:"varint,2,opt,name=wait_for_update,json=waitForUpdate,proto3" json:"wait_for_update,omitempty"` +} + +func (x *UpdateSessionRequest) Reset() { + *x = UpdateSessionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSessionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSessionRequest) ProtoMessage() {} + +func (x *UpdateSessionRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[4] + 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 UpdateSessionRequest.ProtoReflect.Descriptor instead. +func (*UpdateSessionRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateSessionRequest) GetSession() *Session { + if x != nil { + return x.Session + } + return nil +} + +func (x *UpdateSessionRequest) GetWaitForUpdate() bool { + if x != nil { + return x.WaitForUpdate + } + return false +} + +type ListSessionsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ListSessionsRequest) Reset() { + *x = ListSessionsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSessionsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSessionsRequest) ProtoMessage() {} + +func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[5] + 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 ListSessionsRequest.ProtoReflect.Descriptor instead. +func (*ListSessionsRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{5} +} + +type ListSessionsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Sessions []*Session `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"` +} + +func (x *ListSessionsResponse) Reset() { + *x = ListSessionsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSessionsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSessionsResponse) ProtoMessage() {} + +func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[6] + 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 ListSessionsResponse.ProtoReflect.Descriptor instead. +func (*ListSessionsResponse) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{6} +} + +func (x *ListSessionsResponse) GetSessions() []*Session { + if x != nil { + return x.Sessions + } + return nil +} + +type CreateIceCandidateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionIdentifier *Session_Identifier `protobuf:"bytes,1,opt,name=session_identifier,json=sessionIdentifier,proto3" json:"session_identifier,omitempty"` + Candidate *IceCandidate `protobuf:"bytes,2,opt,name=candidate,proto3" json:"candidate,omitempty"` +} + +func (x *CreateIceCandidateRequest) Reset() { + *x = CreateIceCandidateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateIceCandidateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateIceCandidateRequest) ProtoMessage() {} + +func (x *CreateIceCandidateRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[7] + 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 CreateIceCandidateRequest.ProtoReflect.Descriptor instead. +func (*CreateIceCandidateRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{7} +} + +func (x *CreateIceCandidateRequest) GetSessionIdentifier() *Session_Identifier { + if x != nil { + return x.SessionIdentifier + } + return nil +} + +func (x *CreateIceCandidateRequest) GetCandidate() *IceCandidate { + if x != nil { + return x.Candidate + } + return nil +} + +type PopIceCandidateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionIdentifier *Session_Identifier `protobuf:"bytes,1,opt,name=session_identifier,json=sessionIdentifier,proto3" json:"session_identifier,omitempty"` +} + +func (x *PopIceCandidateRequest) Reset() { + *x = PopIceCandidateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PopIceCandidateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PopIceCandidateRequest) ProtoMessage() {} + +func (x *PopIceCandidateRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[8] + 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 PopIceCandidateRequest.ProtoReflect.Descriptor instead. +func (*PopIceCandidateRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{8} +} + +func (x *PopIceCandidateRequest) GetSessionIdentifier() *Session_Identifier { + if x != nil { + return x.SessionIdentifier + } + return nil +} + +type CreateIceSessionDescriptionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionIdentifier *Session_Identifier `protobuf:"bytes,1,opt,name=session_identifier,json=sessionIdentifier,proto3" json:"session_identifier,omitempty"` + Description *IceSessionDescription `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *CreateIceSessionDescriptionRequest) Reset() { + *x = CreateIceSessionDescriptionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateIceSessionDescriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateIceSessionDescriptionRequest) ProtoMessage() {} + +func (x *CreateIceSessionDescriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[9] + 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 CreateIceSessionDescriptionRequest.ProtoReflect.Descriptor instead. +func (*CreateIceSessionDescriptionRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{9} +} + +func (x *CreateIceSessionDescriptionRequest) GetSessionIdentifier() *Session_Identifier { + if x != nil { + return x.SessionIdentifier + } + return nil +} + +func (x *CreateIceSessionDescriptionRequest) GetDescription() *IceSessionDescription { + if x != nil { + return x.Description + } + return nil +} + +type PopIceSessionDescriptionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionIdentifier *Session_Identifier `protobuf:"bytes,1,opt,name=session_identifier,json=sessionIdentifier,proto3" json:"session_identifier,omitempty"` +} + +func (x *PopIceSessionDescriptionRequest) Reset() { + *x = PopIceSessionDescriptionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PopIceSessionDescriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PopIceSessionDescriptionRequest) ProtoMessage() {} + +func (x *PopIceSessionDescriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[10] + 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 PopIceSessionDescriptionRequest.ProtoReflect.Descriptor instead. +func (*PopIceSessionDescriptionRequest) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{10} +} + +func (x *PopIceSessionDescriptionRequest) GetSessionIdentifier() *Session_Identifier { + if x != nil { + return x.SessionIdentifier + } + return nil +} + +type Camera struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Identifier *Camera_Identifier `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` +} + +func (x *Camera) Reset() { + *x = Camera{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Camera) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Camera) ProtoMessage() {} + +func (x *Camera) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[11] + 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 Camera.ProtoReflect.Descriptor instead. +func (*Camera) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{11} +} + +func (x *Camera) GetIdentifier() *Camera_Identifier { + if x != nil { + return x.Identifier + } + return nil +} + +type IceCandidate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#ICECandidateInit + Candidate string `protobuf:"bytes,1,opt,name=candidate,proto3" json:"candidate,omitempty"` + SdpMid *string `protobuf:"bytes,2,opt,name=sdp_mid,json=sdpMid,proto3,oneof" json:"sdp_mid,omitempty"` + SdpLineIndex *int32 `protobuf:"varint,3,opt,name=sdp_line_index,json=sdpLineIndex,proto3,oneof" json:"sdp_line_index,omitempty"` + UsernameFragment *string `protobuf:"bytes,4,opt,name=username_fragment,json=usernameFragment,proto3,oneof" json:"username_fragment,omitempty"` +} + +func (x *IceCandidate) Reset() { + *x = IceCandidate{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IceCandidate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IceCandidate) ProtoMessage() {} + +func (x *IceCandidate) 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 IceCandidate.ProtoReflect.Descriptor instead. +func (*IceCandidate) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{12} +} + +func (x *IceCandidate) GetCandidate() string { + if x != nil { + return x.Candidate + } + return "" +} + +func (x *IceCandidate) GetSdpMid() string { + if x != nil && x.SdpMid != nil { + return *x.SdpMid + } + return "" +} + +func (x *IceCandidate) GetSdpLineIndex() int32 { + if x != nil && x.SdpLineIndex != nil { + return *x.SdpLineIndex + } + return 0 +} + +func (x *IceCandidate) GetUsernameFragment() string { + if x != nil && x.UsernameFragment != nil { + return *x.UsernameFragment + } + return "" +} + +type IceSessionDescription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#SessionDescription + SdpType int64 `protobuf:"varint,1,opt,name=sdp_type,json=sdpType,proto3" json:"sdp_type,omitempty"` + Sdp string `protobuf:"bytes,2,opt,name=sdp,proto3" json:"sdp,omitempty"` +} + +func (x *IceSessionDescription) Reset() { + *x = IceSessionDescription{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IceSessionDescription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IceSessionDescription) ProtoMessage() {} + +func (x *IceSessionDescription) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[13] + 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 IceSessionDescription.ProtoReflect.Descriptor instead. +func (*IceSessionDescription) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{13} +} + +func (x *IceSessionDescription) GetSdpType() int64 { + if x != nil { + return x.SdpType + } + return 0 +} + +func (x *IceSessionDescription) GetSdp() string { + if x != nil { + return x.Sdp + } + return "" +} + +type Session struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *Session_Identifier `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Camera *Camera_Identifier `protobuf:"bytes,2,opt,name=camera,proto3" json:"camera,omitempty"` + ClientIceCandidates []*IceCandidate `protobuf:"bytes,3,rep,name=client_ice_candidates,json=clientIceCandidates,proto3" json:"client_ice_candidates,omitempty"` + CameraIceCandidates []*IceCandidate `protobuf:"bytes,4,rep,name=camera_ice_candidates,json=cameraIceCandidates,proto3" json:"camera_ice_candidates,omitempty"` + CameraOffer *IceSessionDescription `protobuf:"bytes,5,opt,name=camera_offer,json=cameraOffer,proto3" json:"camera_offer,omitempty"` + ClientAnswer *IceSessionDescription `protobuf:"bytes,6,opt,name=client_answer,json=clientAnswer,proto3" json:"client_answer,omitempty"` +} + +func (x *Session) Reset() { + *x = Session{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Session) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Session) ProtoMessage() {} + +func (x *Session) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[14] + 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 Session.ProtoReflect.Descriptor instead. +func (*Session) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{14} +} + +func (x *Session) GetId() *Session_Identifier { + if x != nil { + return x.Id + } + return nil +} + +func (x *Session) GetCamera() *Camera_Identifier { + if x != nil { + return x.Camera + } + return nil +} + +func (x *Session) GetClientIceCandidates() []*IceCandidate { + if x != nil { + return x.ClientIceCandidates + } + return nil +} + +func (x *Session) GetCameraIceCandidates() []*IceCandidate { + if x != nil { + return x.CameraIceCandidates + } + return nil +} + +func (x *Session) GetCameraOffer() *IceSessionDescription { + if x != nil { + return x.CameraOffer + } + return nil +} + +func (x *Session) GetClientAnswer() *IceSessionDescription { + if x != nil { + return x.ClientAnswer + } + return nil +} + +type AuthToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *AuthToken) Reset() { + *x = AuthToken{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthToken) ProtoMessage() {} + +func (x *AuthToken) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[15] + 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 AuthToken.ProtoReflect.Descriptor instead. +func (*AuthToken) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{15} +} + +func (x *AuthToken) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type CreateAuthTokenRequest_Camera struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Used to uniquely identifier this camera so clients can open + // sessions with it. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *CreateAuthTokenRequest_Camera) Reset() { + *x = CreateAuthTokenRequest_Camera{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAuthTokenRequest_Camera) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAuthTokenRequest_Camera) ProtoMessage() {} + +func (x *CreateAuthTokenRequest_Camera) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[16] + 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 CreateAuthTokenRequest_Camera.ProtoReflect.Descriptor instead. +func (*CreateAuthTokenRequest_Camera) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *CreateAuthTokenRequest_Camera) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type CreateAuthTokenRequest_Client struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CreateAuthTokenRequest_Client) Reset() { + *x = CreateAuthTokenRequest_Client{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAuthTokenRequest_Client) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAuthTokenRequest_Client) ProtoMessage() {} + +func (x *CreateAuthTokenRequest_Client) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[17] + 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 CreateAuthTokenRequest_Client.ProtoReflect.Descriptor instead. +func (*CreateAuthTokenRequest_Client) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{0, 1} +} + +type Camera_Identifier struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *Camera_Identifier) Reset() { + *x = Camera_Identifier{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Camera_Identifier) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Camera_Identifier) ProtoMessage() {} + +func (x *Camera_Identifier) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[18] + 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 Camera_Identifier.ProtoReflect.Descriptor instead. +func (*Camera_Identifier) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{11, 0} +} + +func (x *Camera_Identifier) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type Session_Identifier struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *Session_Identifier) Reset() { + *x = Session_Identifier{} + if protoimpl.UnsafeEnabled { + mi := &file_signaler_service_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Session_Identifier) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Session_Identifier) ProtoMessage() {} + +func (x *Session_Identifier) ProtoReflect() protoreflect.Message { + mi := &file_signaler_service_proto_msgTypes[19] + 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 Session_Identifier.ProtoReflect.Descriptor instead. +func (*Session_Identifier) Descriptor() ([]byte, []int) { + return file_signaler_service_proto_rawDescGZIP(), []int{14, 0} +} + +func (x *Session_Identifier) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +var File_signaler_service_proto protoreflect.FileDescriptor + +var file_signaler_service_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, + 0x65, 0x72, 0x22, 0xde, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6d, + 0x65, 0x12, 0x41, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x61, 0x12, 0x41, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x18, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x65, 0x72, + 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, 0x72, + 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6d, + 0x65, 0x72, 0x61, 0x52, 0x07, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x22, 0x6b, 0x0a, 0x14, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x77, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x6b, 0x0a, 0x14, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, + 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x45, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, + 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 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, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x43, + 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x4b, 0x0a, 0x12, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0xb4, 0x01, 0x0a, + 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x12, 0x41, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 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, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x6e, 0x0a, 0x1f, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x11, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x12, 0x3b, 0x0a, + 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6d, + 0x65, 0x72, 0x61, 0x2e, 0x49, 0x64, 0x65, 0x6e, 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, 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, 0x64, 0x70, 0x5f, 0x6d, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x64, 0x70, 0x4d, + 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x73, 0x64, 0x70, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, + 0x0c, 0x73, 0x64, 0x70, 0x4c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x88, 0x01, 0x01, + 0x12, 0x30, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, 0x64, 0x70, 0x5f, 0x6d, 0x69, 0x64, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x73, 0x64, 0x70, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x15, 0x49, 0x63, 0x65, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x64, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x07, 0x73, 0x64, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x64, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x64, 0x70, 0x22, 0xac, 0x03, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x02, 0x69, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x65, 0x72, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, + 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x12, 0x4a, 0x0a, 0x15, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 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, 0x52, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x63, 0x65, 0x43, 0x61, + 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x15, 0x63, 0x61, 0x6d, 0x65, + 0x72, 0x61, 0x5f, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 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, 0x52, + 0x13, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x5f, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x18, 0x05, 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, 0x52, 0x0b, 0x63, 0x61, 0x6d, + 0x65, 0x72, 0x61, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x18, 0x06, 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, + 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x6e, 0x73, 0x77, 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, 0x21, 0x0a, 0x09, + 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, + 0xf4, 0x05, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x65, 0x72, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4a, 0x0a, + 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x12, 0x1c, 0x2e, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, + 0x72, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, + 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, + 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1d, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x51, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, + 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x0f, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, + 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x72, 0x2e, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x65, 0x72, 0x2e, 0x49, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x6c, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2c, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x12, 0x66, + 0x0a, 0x18, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x70, 0x49, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x42, 0x94, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x42, 0x14, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x61, 0x74, + 0x68, 0x61, 0x77, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x68, 0x6f, 0x6d, 0x65, + 0x2d, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x65, 0x6e, 0xa2, + 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, + 0xca, 0x02, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0xe2, 0x02, 0x14, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_signaler_service_proto_rawDescOnce sync.Once + file_signaler_service_proto_rawDescData = file_signaler_service_proto_rawDesc +) + +func file_signaler_service_proto_rawDescGZIP() []byte { + file_signaler_service_proto_rawDescOnce.Do(func() { + file_signaler_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_signaler_service_proto_rawDescData) + }) + return file_signaler_service_proto_rawDescData +} + +var file_signaler_service_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_signaler_service_proto_goTypes = []interface{}{ + (*CreateAuthTokenRequest)(nil), // 0: signaler.CreateAuthTokenRequest + (*ListCamerasRequest)(nil), // 1: signaler.ListCamerasRequest + (*ListCamerasResponse)(nil), // 2: signaler.ListCamerasResponse + (*CreateSessionRequest)(nil), // 3: signaler.CreateSessionRequest + (*UpdateSessionRequest)(nil), // 4: signaler.UpdateSessionRequest + (*ListSessionsRequest)(nil), // 5: signaler.ListSessionsRequest + (*ListSessionsResponse)(nil), // 6: signaler.ListSessionsResponse + (*CreateIceCandidateRequest)(nil), // 7: signaler.CreateIceCandidateRequest + (*PopIceCandidateRequest)(nil), // 8: signaler.PopIceCandidateRequest + (*CreateIceSessionDescriptionRequest)(nil), // 9: signaler.CreateIceSessionDescriptionRequest + (*PopIceSessionDescriptionRequest)(nil), // 10: signaler.PopIceSessionDescriptionRequest + (*Camera)(nil), // 11: signaler.Camera + (*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 +} +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 + 11, // 2: signaler.ListCamerasResponse.cameras:type_name -> signaler.Camera + 14, // 3: signaler.CreateSessionRequest.session:type_name -> signaler.Session + 14, // 4: signaler.UpdateSessionRequest.session:type_name -> signaler.Session + 14, // 5: signaler.ListSessionsResponse.sessions:type_name -> signaler.Session + 19, // 6: signaler.CreateIceCandidateRequest.session_identifier:type_name -> signaler.Session.Identifier + 12, // 7: signaler.CreateIceCandidateRequest.candidate:type_name -> signaler.IceCandidate + 19, // 8: signaler.PopIceCandidateRequest.session_identifier:type_name -> signaler.Session.Identifier + 19, // 9: signaler.CreateIceSessionDescriptionRequest.session_identifier:type_name -> signaler.Session.Identifier + 13, // 10: signaler.CreateIceSessionDescriptionRequest.description:type_name -> signaler.IceSessionDescription + 19, // 11: signaler.PopIceSessionDescriptionRequest.session_identifier:type_name -> signaler.Session.Identifier + 18, // 12: signaler.Camera.identifier:type_name -> signaler.Camera.Identifier + 19, // 13: signaler.Session.id:type_name -> signaler.Session.Identifier + 18, // 14: signaler.Session.camera:type_name -> signaler.Camera.Identifier + 12, // 15: signaler.Session.client_ice_candidates:type_name -> signaler.IceCandidate + 12, // 16: signaler.Session.camera_ice_candidates:type_name -> signaler.IceCandidate + 13, // 17: signaler.Session.camera_offer:type_name -> signaler.IceSessionDescription + 13, // 18: signaler.Session.client_answer:type_name -> signaler.IceSessionDescription + 0, // 19: signaler.SignalerService.CreateAuthToken:input_type -> signaler.CreateAuthTokenRequest + 1, // 20: signaler.SignalerService.ListCameras:input_type -> signaler.ListCamerasRequest + 3, // 21: signaler.SignalerService.CreateSession:input_type -> signaler.CreateSessionRequest + 4, // 22: signaler.SignalerService.UpdateSession:input_type -> signaler.UpdateSessionRequest + 5, // 23: signaler.SignalerService.ListSessions:input_type -> signaler.ListSessionsRequest + 7, // 24: signaler.SignalerService.CreateIceCandidate:input_type -> signaler.CreateIceCandidateRequest + 8, // 25: signaler.SignalerService.PopIceCandidate:input_type -> signaler.PopIceCandidateRequest + 9, // 26: signaler.SignalerService.CreateIceSessionDescription:input_type -> signaler.CreateIceSessionDescriptionRequest + 10, // 27: signaler.SignalerService.PopIceSessionDescription:input_type -> signaler.PopIceSessionDescriptionRequest + 15, // 28: signaler.SignalerService.CreateAuthToken:output_type -> signaler.AuthToken + 2, // 29: signaler.SignalerService.ListCameras:output_type -> signaler.ListCamerasResponse + 14, // 30: signaler.SignalerService.CreateSession:output_type -> signaler.Session + 14, // 31: signaler.SignalerService.UpdateSession:output_type -> signaler.Session + 6, // 32: signaler.SignalerService.ListSessions:output_type -> signaler.ListSessionsResponse + 12, // 33: signaler.SignalerService.CreateIceCandidate:output_type -> signaler.IceCandidate + 12, // 34: signaler.SignalerService.PopIceCandidate:output_type -> signaler.IceCandidate + 13, // 35: signaler.SignalerService.CreateIceSessionDescription:output_type -> signaler.IceSessionDescription + 13, // 36: signaler.SignalerService.PopIceSessionDescription:output_type -> signaler.IceSessionDescription + 28, // [28:37] is the sub-list for method output_type + 19, // [19:28] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name +} + +func init() { file_signaler_service_proto_init() } +func file_signaler_service_proto_init() { + if File_signaler_service_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_signaler_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateAuthTokenRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListCamerasRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListCamerasResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSessionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSessionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSessionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSessionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateIceCandidateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PopIceCandidateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateIceSessionDescriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PopIceSessionDescriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Camera); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IceCandidate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IceSessionDescription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Session); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateAuthTokenRequest_Camera); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateAuthTokenRequest_Client); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signaler_service_proto_msgTypes[18].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[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Session_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[0].OneofWrappers = []interface{}{ + (*CreateAuthTokenRequest_Camera_)(nil), + (*CreateAuthTokenRequest_Client_)(nil), + } + file_signaler_service_proto_msgTypes[12].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, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_signaler_service_proto_goTypes, + DependencyIndexes: file_signaler_service_proto_depIdxs, + MessageInfos: file_signaler_service_proto_msgTypes, + }.Build() + File_signaler_service_proto = out.File + file_signaler_service_proto_rawDesc = nil + file_signaler_service_proto_goTypes = nil + file_signaler_service_proto_depIdxs = nil +} diff --git a/gen/signaler_service.pbenum.dart b/gen/signaler_service.pbenum.dart new file mode 100644 index 0000000..65d3e63 --- /dev/null +++ b/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/gen/signaler_service.pbjson.dart b/gen/signaler_service.pbjson.dart new file mode 100644 index 0000000..f927274 --- /dev/null +++ b/gen/signaler_service.pbjson.dart @@ -0,0 +1,338 @@ +// +// 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 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 createIceCandidateRequestDescriptor instead') +const CreateIceCandidateRequest$json = { + '1': 'CreateIceCandidateRequest', + '2': [ + {'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'}, + {'1': 'candidate', '3': 2, '4': 1, '5': 11, '6': '.signaler.IceCandidate', '10': 'candidate'}, + ], +}; + +/// Descriptor for `CreateIceCandidateRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createIceCandidateRequestDescriptor = $convert.base64Decode( + 'ChlDcmVhdGVJY2VDYW5kaWRhdGVSZXF1ZXN0EksKEnNlc3Npb25faWRlbnRpZmllchgBIAEoCz' + 'IcLnNpZ25hbGVyLlNlc3Npb24uSWRlbnRpZmllclIRc2Vzc2lvbklkZW50aWZpZXISNAoJY2Fu' + 'ZGlkYXRlGAIgASgLMhYuc2lnbmFsZXIuSWNlQ2FuZGlkYXRlUgljYW5kaWRhdGU='); + +@$core.Deprecated('Use popIceCandidateRequestDescriptor instead') +const PopIceCandidateRequest$json = { + '1': 'PopIceCandidateRequest', + '2': [ + {'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'}, + ], +}; + +/// Descriptor for `PopIceCandidateRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List popIceCandidateRequestDescriptor = $convert.base64Decode( + 'ChZQb3BJY2VDYW5kaWRhdGVSZXF1ZXN0EksKEnNlc3Npb25faWRlbnRpZmllchgBIAEoCzIcLn' + 'NpZ25hbGVyLlNlc3Npb24uSWRlbnRpZmllclIRc2Vzc2lvbklkZW50aWZpZXI='); + +@$core.Deprecated('Use createIceSessionDescriptionRequestDescriptor instead') +const CreateIceSessionDescriptionRequest$json = { + '1': 'CreateIceSessionDescriptionRequest', + '2': [ + {'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'}, + {'1': 'description', '3': 2, '4': 1, '5': 11, '6': '.signaler.IceSessionDescription', '10': 'description'}, + ], +}; + +/// Descriptor for `CreateIceSessionDescriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List createIceSessionDescriptionRequestDescriptor = $convert.base64Decode( + 'CiJDcmVhdGVJY2VTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0EksKEnNlc3Npb25faWRlbnRpZm' + 'llchgBIAEoCzIcLnNpZ25hbGVyLlNlc3Npb24uSWRlbnRpZmllclIRc2Vzc2lvbklkZW50aWZp' + 'ZXISQQoLZGVzY3JpcHRpb24YAiABKAsyHy5zaWduYWxlci5JY2VTZXNzaW9uRGVzY3JpcHRpb2' + '5SC2Rlc2NyaXB0aW9u'); + +@$core.Deprecated('Use popIceSessionDescriptionRequestDescriptor instead') +const PopIceSessionDescriptionRequest$json = { + '1': 'PopIceSessionDescriptionRequest', + '2': [ + {'1': 'session_identifier', '3': 1, '4': 1, '5': 11, '6': '.signaler.Session.Identifier', '10': 'sessionIdentifier'}, + ], +}; + +/// Descriptor for `PopIceSessionDescriptionRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List popIceSessionDescriptionRequestDescriptor = $convert.base64Decode( + 'Ch9Qb3BJY2VTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZXN0EksKEnNlc3Npb25faWRlbnRpZmllch' + 'gBIAEoCzIcLnNpZ25hbGVyLlNlc3Npb24uSWRlbnRpZmllclIRc2Vzc2lvbklkZW50aWZpZXI='); + +@$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 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'}, + {'1': 'client_ice_candidates', '3': 3, '4': 3, '5': 11, '6': '.signaler.IceCandidate', '10': 'clientIceCandidates'}, + {'1': 'camera_ice_candidates', '3': 4, '4': 3, '5': 11, '6': '.signaler.IceCandidate', '10': 'cameraIceCandidates'}, + {'1': 'camera_offer', '3': 5, '4': 1, '5': 11, '6': '.signaler.IceSessionDescription', '10': 'cameraOffer'}, + {'1': 'client_answer', '3': 6, '4': 1, '5': 11, '6': '.signaler.IceSessionDescription', '10': 'clientAnswer'}, + ], + '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' + 'IzCgZjYW1lcmEYAiABKAsyGy5zaWduYWxlci5DYW1lcmEuSWRlbnRpZmllclIGY2FtZXJhEkoK' + 'FWNsaWVudF9pY2VfY2FuZGlkYXRlcxgDIAMoCzIWLnNpZ25hbGVyLkljZUNhbmRpZGF0ZVITY2' + 'xpZW50SWNlQ2FuZGlkYXRlcxJKChVjYW1lcmFfaWNlX2NhbmRpZGF0ZXMYBCADKAsyFi5zaWdu' + 'YWxlci5JY2VDYW5kaWRhdGVSE2NhbWVyYUljZUNhbmRpZGF0ZXMSQgoMY2FtZXJhX29mZmVyGA' + 'UgASgLMh8uc2lnbmFsZXIuSWNlU2Vzc2lvbkRlc2NyaXB0aW9uUgtjYW1lcmFPZmZlchJECg1j' + 'bGllbnRfYW5zd2VyGAYgASgLMh8uc2lnbmFsZXIuSWNlU2Vzc2lvbkRlc2NyaXB0aW9uUgxjbG' + 'llbnRBbnN3ZXIaHAoKSWRlbnRpZmllchIOCgJpZBgBIAEoCVICaWQ='); + +@$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'); + +const $core.Map<$core.String, $core.dynamic> SignalerServiceBase$json = { + '1': 'SignalerService', + '2': [ + {'1': 'CreateAuthToken', '2': '.signaler.CreateAuthTokenRequest', '3': '.signaler.AuthToken'}, + {'1': 'ListCameras', '2': '.signaler.ListCamerasRequest', '3': '.signaler.ListCamerasResponse'}, + {'1': 'CreateSession', '2': '.signaler.CreateSessionRequest', '3': '.signaler.Session'}, + {'1': 'UpdateSession', '2': '.signaler.UpdateSessionRequest', '3': '.signaler.Session'}, + {'1': 'ListSessions', '2': '.signaler.ListSessionsRequest', '3': '.signaler.ListSessionsResponse'}, + {'1': 'CreateIceCandidate', '2': '.signaler.CreateIceCandidateRequest', '3': '.signaler.IceCandidate'}, + {'1': 'PopIceCandidate', '2': '.signaler.PopIceCandidateRequest', '3': '.signaler.IceCandidate'}, + {'1': 'CreateIceSessionDescription', '2': '.signaler.CreateIceSessionDescriptionRequest', '3': '.signaler.IceSessionDescription'}, + {'1': 'PopIceSessionDescription', '2': '.signaler.PopIceSessionDescriptionRequest', '3': '.signaler.IceSessionDescription'}, + ], +}; + +@$core.Deprecated('Use signalerServiceDescriptor instead') +const $core.Map<$core.String, $core.Map<$core.String, $core.dynamic>> SignalerServiceBase$messageJson = { + '.signaler.CreateAuthTokenRequest': CreateAuthTokenRequest$json, + '.signaler.CreateAuthTokenRequest.Camera': CreateAuthTokenRequest_Camera$json, + '.signaler.CreateAuthTokenRequest.Client': CreateAuthTokenRequest_Client$json, + '.signaler.AuthToken': AuthToken$json, + '.signaler.ListCamerasRequest': ListCamerasRequest$json, + '.signaler.ListCamerasResponse': ListCamerasResponse$json, + '.signaler.Camera': Camera$json, + '.signaler.Camera.Identifier': Camera_Identifier$json, + '.signaler.CreateSessionRequest': CreateSessionRequest$json, + '.signaler.Session': Session$json, + '.signaler.Session.Identifier': Session_Identifier$json, + '.signaler.IceCandidate': IceCandidate$json, + '.signaler.IceSessionDescription': IceSessionDescription$json, + '.signaler.UpdateSessionRequest': UpdateSessionRequest$json, + '.signaler.ListSessionsRequest': ListSessionsRequest$json, + '.signaler.ListSessionsResponse': ListSessionsResponse$json, + '.signaler.CreateIceCandidateRequest': CreateIceCandidateRequest$json, + '.signaler.PopIceCandidateRequest': PopIceCandidateRequest$json, + '.signaler.CreateIceSessionDescriptionRequest': CreateIceSessionDescriptionRequest$json, + '.signaler.PopIceSessionDescriptionRequest': PopIceSessionDescriptionRequest$json, +}; + +/// Descriptor for `SignalerService`. Decode as a `google.protobuf.ServiceDescriptorProto`. +final $typed_data.Uint8List signalerServiceDescriptor = $convert.base64Decode( + 'Cg9TaWduYWxlclNlcnZpY2USSAoPQ3JlYXRlQXV0aFRva2VuEiAuc2lnbmFsZXIuQ3JlYXRlQX' + 'V0aFRva2VuUmVxdWVzdBoTLnNpZ25hbGVyLkF1dGhUb2tlbhJKCgtMaXN0Q2FtZXJhcxIcLnNp' + 'Z25hbGVyLkxpc3RDYW1lcmFzUmVxdWVzdBodLnNpZ25hbGVyLkxpc3RDYW1lcmFzUmVzcG9uc2' + 'USQgoNQ3JlYXRlU2Vzc2lvbhIeLnNpZ25hbGVyLkNyZWF0ZVNlc3Npb25SZXF1ZXN0GhEuc2ln' + 'bmFsZXIuU2Vzc2lvbhJCCg1VcGRhdGVTZXNzaW9uEh4uc2lnbmFsZXIuVXBkYXRlU2Vzc2lvbl' + 'JlcXVlc3QaES5zaWduYWxlci5TZXNzaW9uEk0KDExpc3RTZXNzaW9ucxIdLnNpZ25hbGVyLkxp' + 'c3RTZXNzaW9uc1JlcXVlc3QaHi5zaWduYWxlci5MaXN0U2Vzc2lvbnNSZXNwb25zZRJRChJDcm' + 'VhdGVJY2VDYW5kaWRhdGUSIy5zaWduYWxlci5DcmVhdGVJY2VDYW5kaWRhdGVSZXF1ZXN0GhYu' + 'c2lnbmFsZXIuSWNlQ2FuZGlkYXRlEksKD1BvcEljZUNhbmRpZGF0ZRIgLnNpZ25hbGVyLlBvcE' + 'ljZUNhbmRpZGF0ZVJlcXVlc3QaFi5zaWduYWxlci5JY2VDYW5kaWRhdGUSbAobQ3JlYXRlSWNl' + 'U2Vzc2lvbkRlc2NyaXB0aW9uEiwuc2lnbmFsZXIuQ3JlYXRlSWNlU2Vzc2lvbkRlc2NyaXB0aW' + '9uUmVxdWVzdBofLnNpZ25hbGVyLkljZVNlc3Npb25EZXNjcmlwdGlvbhJmChhQb3BJY2VTZXNz' + 'aW9uRGVzY3JpcHRpb24SKS5zaWduYWxlci5Qb3BJY2VTZXNzaW9uRGVzY3JpcHRpb25SZXF1ZX' + 'N0Gh8uc2lnbmFsZXIuSWNlU2Vzc2lvbkRlc2NyaXB0aW9u'); + diff --git a/gen/signaler_service.pbserver.dart b/gen/signaler_service.pbserver.dart new file mode 100644 index 0000000..312d119 --- /dev/null +++ b/gen/signaler_service.pbserver.dart @@ -0,0 +1,67 @@ +// +// 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 +// ignore_for_file: deprecated_member_use_from_same_package, 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:protobuf/protobuf.dart' as $pb; + +import 'signaler_service.pb.dart' as $0; +import 'signaler_service.pbjson.dart'; + +export 'signaler_service.pb.dart'; + +abstract class SignalerServiceBase extends $pb.GeneratedService { + $async.Future<$0.AuthToken> createAuthToken($pb.ServerContext ctx, $0.CreateAuthTokenRequest request); + $async.Future<$0.ListCamerasResponse> listCameras($pb.ServerContext ctx, $0.ListCamerasRequest request); + $async.Future<$0.Session> createSession($pb.ServerContext ctx, $0.CreateSessionRequest request); + $async.Future<$0.Session> updateSession($pb.ServerContext ctx, $0.UpdateSessionRequest request); + $async.Future<$0.ListSessionsResponse> listSessions($pb.ServerContext ctx, $0.ListSessionsRequest request); + $async.Future<$0.IceCandidate> createIceCandidate($pb.ServerContext ctx, $0.CreateIceCandidateRequest request); + $async.Future<$0.IceCandidate> popIceCandidate($pb.ServerContext ctx, $0.PopIceCandidateRequest request); + $async.Future<$0.IceSessionDescription> createIceSessionDescription($pb.ServerContext ctx, $0.CreateIceSessionDescriptionRequest request); + $async.Future<$0.IceSessionDescription> popIceSessionDescription($pb.ServerContext ctx, $0.PopIceSessionDescriptionRequest request); + + $pb.GeneratedMessage createRequest($core.String methodName) { + switch (methodName) { + case 'CreateAuthToken': return $0.CreateAuthTokenRequest(); + case 'ListCameras': return $0.ListCamerasRequest(); + case 'CreateSession': return $0.CreateSessionRequest(); + case 'UpdateSession': return $0.UpdateSessionRequest(); + case 'ListSessions': return $0.ListSessionsRequest(); + case 'CreateIceCandidate': return $0.CreateIceCandidateRequest(); + case 'PopIceCandidate': return $0.PopIceCandidateRequest(); + case 'CreateIceSessionDescription': return $0.CreateIceSessionDescriptionRequest(); + case 'PopIceSessionDescription': return $0.PopIceSessionDescriptionRequest(); + default: throw $core.ArgumentError('Unknown method: $methodName'); + } + } + + $async.Future<$pb.GeneratedMessage> handleCall($pb.ServerContext ctx, $core.String methodName, $pb.GeneratedMessage request) { + switch (methodName) { + case 'CreateAuthToken': return this.createAuthToken(ctx, request as $0.CreateAuthTokenRequest); + case 'ListCameras': return this.listCameras(ctx, request as $0.ListCamerasRequest); + case 'CreateSession': return this.createSession(ctx, request as $0.CreateSessionRequest); + case 'UpdateSession': return this.updateSession(ctx, request as $0.UpdateSessionRequest); + case 'ListSessions': return this.listSessions(ctx, request as $0.ListSessionsRequest); + case 'CreateIceCandidate': return this.createIceCandidate(ctx, request as $0.CreateIceCandidateRequest); + case 'PopIceCandidate': return this.popIceCandidate(ctx, request as $0.PopIceCandidateRequest); + case 'CreateIceSessionDescription': return this.createIceSessionDescription(ctx, request as $0.CreateIceSessionDescriptionRequest); + case 'PopIceSessionDescription': return this.popIceSessionDescription(ctx, request as $0.PopIceSessionDescriptionRequest); + default: throw $core.ArgumentError('Unknown method: $methodName'); + } + } + + $core.Map<$core.String, $core.dynamic> get $json => SignalerServiceBase$json; + $core.Map<$core.String, $core.Map<$core.String, $core.dynamic>> get $messageJson => SignalerServiceBase$messageJson; +} + diff --git a/gen/token/token.pb.dart b/gen/token/token.pb.dart new file mode 100644 index 0000000..df5f211 --- /dev/null +++ b/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/gen/token/token.pb.go b/gen/token/token.pb.go new file mode 100644 index 0000000..9e3d2b7 --- /dev/null +++ b/gen/token/token.pb.go @@ -0,0 +1,158 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: token/token.proto + +package token + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AuthToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + Home string `protobuf:"bytes,2,opt,name=home,proto3" json:"home,omitempty"` +} + +func (x *AuthToken) Reset() { + *x = AuthToken{} + if protoimpl.UnsafeEnabled { + mi := &file_token_token_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthToken) ProtoMessage() {} + +func (x *AuthToken) ProtoReflect() protoreflect.Message { + mi := &file_token_token_proto_msgTypes[0] + 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 AuthToken.ProtoReflect.Descriptor instead. +func (*AuthToken) Descriptor() ([]byte, []int) { + return file_token_token_proto_rawDescGZIP(), []int{0} +} + +func (x *AuthToken) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *AuthToken) GetHome() string { + if x != nil { + return x.Home + } + return "" +} + +var File_token_token_proto protoreflect.FileDescriptor + +var file_token_token_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x31, 0x0a, 0x09, 0x41, 0x75, + 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6d, 0x65, 0x42, 0x81, 0x01, + 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0a, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x61, 0x74, 0x68, 0x61, 0x77, 0x61, 0x79, 0x2d, + 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2d, 0x73, 0x65, 0x6e, 0x73, 0x6f, + 0x72, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0xa2, + 0x02, 0x03, 0x54, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0xca, 0x02, 0x05, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0xe2, 0x02, 0x11, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_token_token_proto_rawDescOnce sync.Once + file_token_token_proto_rawDescData = file_token_token_proto_rawDesc +) + +func file_token_token_proto_rawDescGZIP() []byte { + file_token_token_proto_rawDescOnce.Do(func() { + file_token_token_proto_rawDescData = protoimpl.X.CompressGZIP(file_token_token_proto_rawDescData) + }) + return file_token_token_proto_rawDescData +} + +var file_token_token_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_token_token_proto_goTypes = []interface{}{ + (*AuthToken)(nil), // 0: token.AuthToken +} +var file_token_token_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_token_token_proto_init() } +func file_token_token_proto_init() { + if File_token_token_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_token_token_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_token_token_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_token_token_proto_goTypes, + DependencyIndexes: file_token_token_proto_depIdxs, + MessageInfos: file_token_token_proto_msgTypes, + }.Build() + File_token_token_proto = out.File + file_token_token_proto_rawDesc = nil + file_token_token_proto_goTypes = nil + file_token_token_proto_depIdxs = nil +} diff --git a/gen/token/token.pbenum.dart b/gen/token/token.pbenum.dart new file mode 100644 index 0000000..ca20d26 --- /dev/null +++ b/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/gen/token/token.pbjson.dart b/gen/token/token.pbjson.dart new file mode 100644 index 0000000..376b888 --- /dev/null +++ b/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/gen/token/token.pbserver.dart b/gen/token/token.pbserver.dart new file mode 100644 index 0000000..f116027 --- /dev/null +++ b/gen/token/token.pbserver.dart @@ -0,0 +1,14 @@ +// +// 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 +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_final_fields +// ignore_for_file: unnecessary_import, unnecessary_this, unused_import + +export 'token.pb.dart'; + diff --git a/go.mod b/go.mod index 8d409e8..1c20247 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,41 @@ module github.com/chathaway-codes/home-sensors/v2 go 1.21.1 + +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 + google.golang.org/grpc v1.58.1 + google.golang.org/protobuf v1.31.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/pion/datachannel v1.5.5 // indirect + github.com/pion/dtls/v2 v2.2.7 // indirect + github.com/pion/ice/v2 v2.3.11 // indirect + github.com/pion/interceptor v0.1.18 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.8 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.10 // indirect + github.com/pion/rtp v1.8.1 // indirect + github.com/pion/sctp v1.8.8 // indirect + github.com/pion/sdp/v3 v3.0.6 // indirect + github.com/pion/srtp/v2 v2.0.17 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.3 // indirect + github.com/pion/turn/v2 v2.1.3 // indirect + 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 + 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 new file mode 100644 index 0000000..2d609f9 --- /dev/null +++ b/go.sum @@ -0,0 +1,259 @@ +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= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +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= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/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/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= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +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= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/signaler/signaler.go b/pkg/signaler/signaler.go new file mode 100644 index 0000000..23e4d51 --- /dev/null +++ b/pkg/signaler/signaler.go @@ -0,0 +1,235 @@ +// Package signaler implements a signaler server. +package signaler + +import ( + "context" + "encoding/base64" + "fmt" + "net/http" + "sync" + "time" + + "connectrpc.com/connect" + pb "github.com/chathaway-codes/home-sensors/v2/gen" + internalpb "github.com/chathaway-codes/home-sensors/v2/gen/token" + "github.com/gofrs/uuid/v5" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +type camera struct { + id string +} + +type Server struct { + mu sync.Mutex + camerasByHome map[string]map[string]*camera + sessionsByCamera map[string]map[string]*pb.Session + sessionsById map[string]*pb.Session + waitersBySessionId map[string][]chan<- bool +} + +func New() *Server { + return &Server{ + camerasByHome: make(map[string]map[string]*camera), + sessionsByCamera: make(map[string]map[string]*pb.Session), + sessionsById: make(map[string]*pb.Session), + waitersBySessionId: make(map[string][]chan<- bool), + } +} + +func (s *Server) CreateAuthToken(ctx context.Context, request *connect.Request[pb.CreateAuthTokenRequest]) (*connect.Response[pb.AuthToken], error) { + req := request.Msg + + switch req.Type.(type) { + case *pb.CreateAuthTokenRequest_Camera_: + id := req.GetCamera().GetId() + s.mu.Lock() + thisCamera := &camera{ + id: id, + } + home := req.GetHome() + if _, ok := s.camerasByHome[home]; !ok { + s.camerasByHome[home] = make(map[string]*camera) + } + s.camerasByHome[home][id] = thisCamera + s.mu.Unlock() + } + + myUUID, err := uuid.NewV4() + if err != nil { + return nil, fmt.Errorf("error creating UUID: %v", err) + } + id := myUUID.String() + + token := &internalpb.AuthToken{ + Uid: id, + Home: req.GetHome(), + } + bytes, err := proto.Marshal(token) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to generate token: %v", err) + } + outToken := base64.URLEncoding.EncodeToString(bytes) + return connect.NewResponse(&pb.AuthToken{ + Token: outToken, + }), nil +} + +func (s *Server) ListCameras(ctx context.Context, request *connect.Request[pb.ListCamerasRequest]) (*connect.Response[pb.ListCamerasResponse], error) { + authToken, err := getAuthToken(request) + if err != nil { + return nil, err + } + s.mu.Lock() + defer s.mu.Unlock() + var cameras []*pb.Camera + for _, camera := range s.camerasByHome[authToken.Home] { + cameras = append(cameras, &pb.Camera{ + Identifier: &pb.Camera_Identifier{ + Id: camera.id, + }, + }) + } + return connect.NewResponse(&pb.ListCamerasResponse{Cameras: cameras}), nil +} + +// CreateSession creates a new session that can be seen bv the provided Camera and Peer. +// +// 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) { + req := request.Msg + if req.GetSession() == nil { + return nil, status.Errorf(codes.InvalidArgument, "nil session") + } + myUUID, err := uuid.NewV4() + if err != nil { + return nil, fmt.Errorf("error creating UUID: %v", err) + } + id := myUUID.String() + req.GetSession().Id = &pb.Session_Identifier{Id: id} + + s.upsertSession(req.GetSession(), req.GetWaitForUpdate()) + + s.mu.Lock() + defer s.mu.Unlock() + + // Spin off goroutine to eventually cleanup the session + go s.scheduleCleanup(id, time.Minute) + + returnSession := s.sessionsById[id] + + return connect.NewResponse(returnSession), nil +} + +// UpdateSession updates the session +func (s *Server) UpdateSession(ctx context.Context, request *connect.Request[pb.UpdateSessionRequest]) (*connect.Response[pb.Session], error) { + req := request.Msg + id := req.GetSession().GetId().GetId() + s.mu.Lock() + if _, ok := s.sessionsById[id]; !ok { + s.mu.Unlock() + return nil, status.Errorf(codes.NotFound, "no such session %q", id) + } + s.mu.Unlock() + + s.upsertSession(req.GetSession(), req.WaitForUpdate) + + s.mu.Lock() + defer s.mu.Unlock() + + returnSession := s.sessionsById[id] + + return connect.NewResponse(returnSession), nil +} + +// ListSessions lists all sessions the client should consider. +// +// TODO: it would be better if we could alert a camera to poll for sessions +// i.e., with websockets (or streaming RPCs). +func (s *Server) ListSessions(context.Context, *connect.Request[pb.ListSessionsRequest]) (*connect.Response[pb.ListSessionsResponse], error) { + var sessions []*pb.Session + for _, session := range s.sessionsById { + sessions = append(sessions, session) + } + return connect.NewResponse(&pb.ListSessionsResponse{Sessions: sessions}), nil +} + +func (s *Server) CreateIceCandidate(context.Context, *connect.Request[pb.CreateIceCandidateRequest]) (*connect.Response[pb.IceCandidate], error) { + return nil, fmt.Errorf("") +} + +func (s *Server) PopIceCandidate(context.Context, *connect.Request[pb.PopIceCandidateRequest]) (*connect.Response[pb.IceCandidate], error) { + return nil, fmt.Errorf("") +} + +func (s *Server) CreateIceSessionDescription(context.Context, *connect.Request[pb.CreateIceSessionDescriptionRequest]) (*connect.Response[pb.IceSessionDescription], error) { + return nil, fmt.Errorf("") +} + +func (s *Server) PopIceSessionDescription(context.Context, *connect.Request[pb.PopIceSessionDescriptionRequest]) (*connect.Response[pb.IceSessionDescription], error) { + return nil, fmt.Errorf("") +} + +// upsertSession updates or creates a session, optionally blocking until the session is updated +// again in the future. +// +// WARN: this function locks and unlocks s.mu; make sure no locks are held or it will block forever. +func (s *Server) upsertSession(session *pb.Session, waitForUpdate bool) { + s.mu.Lock() + defer s.mu.Unlock() + id := session.Id.Id + + s.sessionsById[id] = session + cameraID := session.GetCamera().GetId() + if _, ok := s.sessionsByCamera[cameraID]; !ok { + s.sessionsByCamera[cameraID] = make(map[string]*pb.Session) + } + s.sessionsByCamera[cameraID][id] = session + + // Alert anything that needs to go + for _, waiter := range s.waitersBySessionId[id] { + waiter <- true + close(waiter) + } + s.waitersBySessionId[id] = nil + + if waitForUpdate { + waitChan := make(chan bool) + s.waitersBySessionId[id] = append(s.waitersBySessionId[id], waitChan) + defer func() { + <-waitChan + }() + } +} + +func (s *Server) scheduleCleanup(sessionID string, waitPeriod time.Duration) { + time.Sleep(waitPeriod) + + s.mu.Lock() + defer s.mu.Unlock() + + session := s.sessionsById[sessionID] + for _, water := range s.waitersBySessionId[sessionID] { + water <- true + close(water) + } + delete(s.sessionsByCamera[session.GetCamera().GetId()], sessionID) + delete(s.sessionsById, sessionID) + delete(s.waitersBySessionId, sessionID) +} + +func getAuthToken[T any](req *connect.Request[T]) (*internalpb.AuthToken, error) { + authHeader := req.Header().Get(http.CanonicalHeaderKey("Authorization")) + bytes, err := base64.URLEncoding.DecodeString(authHeader) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "malformed authorization header (extract)") + } + authToken := &internalpb.AuthToken{} + if err := proto.Unmarshal(bytes, authToken); err != nil { + return nil, status.Errorf(codes.InvalidArgument, "malformed authorization header (parse)") + } + return authToken, nil +} diff --git a/proto/signaler_service.proto b/proto/signaler_service.proto index 630db15..11f38f5 100644 --- a/proto/signaler_service.proto +++ b/proto/signaler_service.proto @@ -1,6 +1,9 @@ syntax = "proto3"; +package signaler; + service SignalerService { + rpc CreateAuthToken(CreateAuthTokenRequest) returns (AuthToken); rpc ListCameras(ListCamerasRequest) returns (ListCamerasResponse); // CreateSession creates a new session that can be seen bv the provided Camera and Peer. @@ -15,6 +18,34 @@ service SignalerService { // TODO: it would be better if we could alert a camera to poll for sessions // i.e., with websockets (or streaming RPCs). rpc ListSessions(ListSessionsRequest) returns (ListSessionsResponse); + + // CreateIceCandidate adds the provided candidate to the list of candidates. + rpc CreateIceCandidate(CreateIceCandidateRequest) returns (IceCandidate); + // PopIceCandidate delete a candidate from the list of candidates and returns it. + // + // If there are no candidates, this blocks until one becomes available. + rpc PopIceCandidate(PopIceCandidateRequest) returns (IceCandidate); + + rpc CreateIceSessionDescription(CreateIceSessionDescriptionRequest) returns (IceSessionDescription); + rpc PopIceSessionDescription(PopIceSessionDescriptionRequest) returns (IceSessionDescription); + +} + +message CreateAuthTokenRequest{ + // Homes this auth token should be registered too. + string home = 1; + + message Camera { + // Used to uniquely identifier this camera so clients can open + // sessions with it. + string id = 1; + } + message Client {} + + oneof type { + Camera camera = 2; + Client client = 3; + } } message ListCamerasRequest {} @@ -41,6 +72,30 @@ message UpdateSessionRequest { bool wait_for_update = 2; } +message ListSessionsRequest {} + +message ListSessionsResponse { + repeated Session sessions = 1; +} + +message CreateIceCandidateRequest { + Session.Identifier session_identifier = 1; + IceCandidate candidate = 2; +} + +message PopIceCandidateRequest { + Session.Identifier session_identifier = 1; +} + +message CreateIceSessionDescriptionRequest { + Session.Identifier session_identifier = 1; + IceSessionDescription description = 2; +} + +message PopIceSessionDescriptionRequest { + Session.Identifier session_identifier = 1; +} + message Camera { message Identifier { string id = 1; @@ -58,7 +113,7 @@ message IceCandidate { message IceSessionDescription { // Copied from https://pkg.go.dev/github.com/pion/webrtc/v4#SessionDescription - int sdp_type = 1; + int64 sdp_type = 1; string sdp = 2; } @@ -73,4 +128,8 @@ message Session { IceSessionDescription camera_offer = 5; IceSessionDescription client_answer = 6; +} + +message AuthToken { + string token = 1; } \ No newline at end of file diff --git a/proto/token/token.proto b/proto/token/token.proto new file mode 100644 index 0000000..5fdd7a3 --- /dev/null +++ b/proto/token/token.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; +package token; + +message AuthToken { + string uid = 1; + string home = 2; +} \ No newline at end of file