From c951da588bc110a8c4f8b9afb34f8805e8da06b2 Mon Sep 17 00:00:00 2001 From: Safeer Jiwan Date: Mon, 4 Nov 2024 11:38:23 -0800 Subject: [PATCH 1/3] feat: timeline events for pubsub events --- backend/controller/console/console.go | 57 + backend/controller/controller.go | 34 +- .../cronjobs/internal/cronjobs_test.go | 2 +- backend/controller/dal/async_calls_test.go | 5 +- backend/controller/dal/dal_test.go | 6 +- .../dal/internal/sql/queries.sql.go | 23 +- backend/controller/pubsub/internal/dal/dal.go | 44 +- .../pubsub/internal/sql/queries.sql | 10 +- .../pubsub/internal/sql/queries.sql.go | 23 +- backend/controller/pubsub/service.go | 7 +- .../20241101215338_timeline_pubsub_events.sql | 6 + .../timeline/events_pubsub_consume.go | 87 + .../timeline/events_pubsub_publish.go | 85 + .../timeline/internal/sql/models.go | 2 + .../timeline/internal/sql/querier.go | 2 + .../timeline/internal/sql/queries.sql | 50 + .../timeline/internal/sql/queries.sql.go | 98 ++ .../timeline/internal/timeline_test.go | 57 +- backend/controller/timeline/query.go | 54 + backend/controller/timeline/timeline.go | 6 + .../xyz/block/ftl/v1/console/console.pb.go | 1517 ++++++++++------- .../xyz/block/ftl/v1/console/console.proto | 26 + .../src/features/timeline/Timeline.tsx | 8 + .../features/timeline/TimelineEventList.tsx | 8 + .../src/features/timeline/TimelineIcon.tsx | 6 +- .../timeline/TimelinePubSubConsume.tsx | 23 + .../timeline/TimelinePubSubPublish.tsx | 17 + .../details/TimelineDetailsHeader.tsx | 13 +- .../details/TimelinePubSubConsumeDetails.tsx | 34 + .../details/TimelinePubSubPublishDetails.tsx | 34 + .../timeline/filters/TimelineFilterPanel.tsx | 4 +- .../src/features/timeline/timeline.utils.ts | 4 + .../xyz/block/ftl/v1/console/console_pb.ts | 184 ++ .../xyz/block/ftl/v1/console/console_pb2.py | 150 +- .../xyz/block/ftl/v1/console/console_pb2.pyi | 52 +- 35 files changed, 2021 insertions(+), 717 deletions(-) create mode 100644 backend/controller/sql/schema/20241101215338_timeline_pubsub_events.sql create mode 100644 backend/controller/timeline/events_pubsub_consume.go create mode 100644 backend/controller/timeline/events_pubsub_publish.go create mode 100644 frontend/console/src/features/timeline/TimelinePubSubConsume.tsx create mode 100644 frontend/console/src/features/timeline/TimelinePubSubPublish.tsx create mode 100644 frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx create mode 100644 frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx diff --git a/backend/controller/console/console.go b/backend/controller/console/console.go index edeaf81194..e381dfa8f5 100644 --- a/backend/controller/console/console.go +++ b/backend/controller/console/console.go @@ -597,6 +597,10 @@ func eventsQueryProtoToDAL(pb *pbconsole.EventsQuery) ([]timeline.TimelineFilter eventTypes = append(eventTypes, timeline.EventTypeCronScheduled) case pbconsole.EventType_EVENT_TYPE_ASYNC_EXECUTE: eventTypes = append(eventTypes, timeline.EventTypeAsyncExecute) + case pbconsole.EventType_EVENT_TYPE_PUBSUB_PUBLISH: + eventTypes = append(eventTypes, timeline.EventTypePubSubPublish) + case pbconsole.EventType_EVENT_TYPE_PUBSUB_CONSUME: + eventTypes = append(eventTypes, timeline.EventTypePubSubConsume) default: return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("unknown event type %v", eventType)) } @@ -827,6 +831,59 @@ func eventDALToProto(event timeline.Event) *pbconsole.Event { }, } + case *timeline.PubSubPublishEvent: + var requestKey *string + if r, ok := event.RequestKey.Get(); ok { + requestKey = &r + } + + return &pbconsole.Event{ + TimeStamp: timestamppb.New(event.Time), + Id: event.ID, + Entry: &pbconsole.Event_PubsubPublish{ + PubsubPublish: &pbconsole.PubSubPublishEvent{ + DeploymentKey: event.DeploymentKey.String(), + RequestKey: requestKey, + VerbRef: event.SourceVerb.ToProto().(*schemapb.Ref), //nolint:forcetypeassert + TimeStamp: timestamppb.New(event.Time), + Duration: durationpb.New(event.Duration), + Topic: event.Topic, + Request: string(event.Request), + Error: event.Error.Ptr(), + }, + }, + } + + case *timeline.PubSubConsumeEvent: + var requestKey *string + if r, ok := event.RequestKey.Get(); ok { + requestKey = &r + } + + var destVerbModule string + var destVerbName string + if destVerb, ok := event.DestVerb.Get(); ok { + destVerbModule = destVerb.Module + destVerbName = destVerb.Name + } + + return &pbconsole.Event{ + TimeStamp: timestamppb.New(event.Time), + Id: event.ID, + Entry: &pbconsole.Event_PubsubConsume{ + PubsubConsume: &pbconsole.PubSubConsumeEvent{ + DeploymentKey: event.DeploymentKey.String(), + RequestKey: requestKey, + DestVerbModule: &destVerbModule, + DestVerbName: &destVerbName, + TimeStamp: timestamppb.New(event.Time), + Duration: durationpb.New(event.Duration), + Topic: event.Topic, + Error: event.Error.Ptr(), + }, + }, + } + default: panic(fmt.Errorf("unknown event type %T", event)) } diff --git a/backend/controller/controller.go b/backend/controller/controller.go index 3f57c3ba72..6cd58724b3 100644 --- a/backend/controller/controller.go +++ b/backend/controller/controller.go @@ -293,13 +293,12 @@ func New( } svc.schemaState.Store(schemaState{routes: map[string]Route{}, schema: &schema.Schema{}}) - pubSub := pubsub.New(ctx, conn, encryption, optional.Some[pubsub.AsyncCallListener](svc)) - svc.pubSub = pubSub - svc.registry = artefacts.New(conn) timelineSvc := timeline.New(ctx, conn, encryption) svc.timeline = timelineSvc + pubSub := pubsub.New(ctx, conn, encryption, optional.Some[pubsub.AsyncCallListener](svc), timelineSvc) + svc.pubSub = pubSub cronSvc := cronjobs.New(ctx, key, svc.config.Advertise.Host, encryption, timelineSvc, conn) svc.cronJobs = cronSvc svc.dal = dal.New(ctx, conn, encryption, pubSub, cronSvc) @@ -859,7 +858,36 @@ func (s *Service) Call(ctx context.Context, req *connect.Request[ftlv1.CallReque func (s *Service) PublishEvent(ctx context.Context, req *connect.Request[ftlv1.PublishEventRequest]) (*connect.Response[ftlv1.PublishEventResponse], error) { // Publish the event. + now := time.Now().UTC() + pubishError := optional.None[string]() err := s.pubSub.PublishEventForTopic(ctx, req.Msg.Topic.Module, req.Msg.Topic.Name, req.Msg.Caller, req.Msg.Body) + if err != nil { + pubishError = optional.Some(err.Error()) + } + + requestKey := optional.None[string]() + if rk, err := rpc.RequestKeyFromContext(ctx); err == nil { + if rk, ok := rk.Get(); ok { + requestKey = optional.Some(rk.String()) + } + } + + // Add to timeline. + sstate := s.schemaState.Load() + module := req.Msg.Topic.Module + route, ok := sstate.routes[module] + if ok { + s.timeline.EnqueueEvent(ctx, &timeline.PubSubPublish{ + DeploymentKey: route.Deployment, + RequestKey: requestKey, + Time: now, + SourceVerb: schema.Ref{Name: req.Msg.Caller, Module: req.Msg.Topic.Module}, + Topic: req.Msg.Topic.Name, + Request: req.Msg, + Error: pubishError, + }) + } + if err != nil { return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("failed to publish a event to topic %s:%s: %w", req.Msg.Topic.Module, req.Msg.Topic.Name, err)) } diff --git a/backend/controller/cronjobs/internal/cronjobs_test.go b/backend/controller/cronjobs/internal/cronjobs_test.go index 763bbef238..7a4f18f2d9 100644 --- a/backend/controller/cronjobs/internal/cronjobs_test.go +++ b/backend/controller/cronjobs/internal/cronjobs_test.go @@ -47,7 +47,7 @@ func TestNewCronJobsForModule(t *testing.T) { timelineSrv := timeline.New(ctx, conn, encryption) cjs := cronjobs.NewForTesting(ctx, key, "test.com", encryption, timelineSrv, *dal, clk) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timelineSrv) parentDAL := parentdal.New(ctx, conn, encryption, pubSub, cjs) moduleName := "initial" jobsToCreate := newCronJobs(t, moduleName, "* * * * * *", clk, 2) // every minute diff --git a/backend/controller/dal/async_calls_test.go b/backend/controller/dal/async_calls_test.go index 4dd484d8d9..457bc7ec5e 100644 --- a/backend/controller/dal/async_calls_test.go +++ b/backend/controller/dal/async_calls_test.go @@ -11,6 +11,7 @@ import ( "github.com/TBD54566975/ftl/backend/controller/encryption" "github.com/TBD54566975/ftl/backend/controller/pubsub" "github.com/TBD54566975/ftl/backend/controller/sql/sqltest" + "github.com/TBD54566975/ftl/backend/controller/timeline" "github.com/TBD54566975/ftl/backend/libdal" "github.com/TBD54566975/ftl/internal/log" "github.com/TBD54566975/ftl/internal/model" @@ -22,7 +23,9 @@ func TestNoCallToAcquire(t *testing.T) { conn := sqltest.OpenForTesting(ctx, t) encryption, err := encryption.New(ctx, conn, encryption.NewBuilder()) assert.NoError(t, err) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) + + timelineSvc := timeline.New(ctx, conn, encryption) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timelineSvc) dal := New(ctx, conn, encryption, pubSub, nil) _, _, err = dal.AcquireAsyncCall(ctx) diff --git a/backend/controller/dal/dal_test.go b/backend/controller/dal/dal_test.go index 5d4dc4a092..77bd107af4 100644 --- a/backend/controller/dal/dal_test.go +++ b/backend/controller/dal/dal_test.go @@ -33,8 +33,8 @@ func TestDAL(t *testing.T) { encryption, err := encryption.New(ctx, conn, encryption.NewBuilder()) assert.NoError(t, err) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) timelineSrv := timeline.New(ctx, conn, encryption) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timelineSrv) key := model.NewControllerKey("localhost", "8081") cjs := cronjobs.New(ctx, key, "test.com", encryption, timelineSrv, conn) dal := New(ctx, conn, encryption, pubSub, cjs) @@ -195,9 +195,9 @@ func TestCreateArtefactConflict(t *testing.T) { encryption, err := encryption.New(ctx, conn, encryption.NewBuilder()) assert.NoError(t, err) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) - timelineSrv := timeline.New(ctx, conn, encryption) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timelineSrv) + key := model.NewControllerKey("localhost", "8081") cjs := cronjobs.New(ctx, key, "test.com", encryption, timelineSrv, conn) dal := New(ctx, conn, encryption, pubSub, cjs) diff --git a/backend/controller/dal/internal/sql/queries.sql.go b/backend/controller/dal/internal/sql/queries.sql.go index 398307d745..e7b669704d 100644 --- a/backend/controller/dal/internal/sql/queries.sql.go +++ b/backend/controller/dal/internal/sql/queries.sql.go @@ -1055,9 +1055,11 @@ SELECT subscribers.retry_attempts as retry_attempts, subscribers.backoff as backoff, subscribers.max_backoff as max_backoff, - subscribers.catch_verb as catch_verb + subscribers.catch_verb as catch_verb, + deployments.key as deployment_key FROM topic_subscribers as subscribers JOIN topic_subscriptions ON subscribers.topic_subscriptions_id = topic_subscriptions.id + JOIN deployments ON subscribers.deployment_id = deployments.id WHERE topic_subscriptions.key = $1::subscription_key ORDER BY RANDOM() LIMIT 1 @@ -1069,6 +1071,7 @@ type GetRandomSubscriberRow struct { Backoff sqltypes.Duration MaxBackoff sqltypes.Duration CatchVerb optional.Option[schema.RefKey] + DeploymentKey model.DeploymentKey } func (q *Queries) GetRandomSubscriber(ctx context.Context, key model.SubscriptionKey) (GetRandomSubscriberRow, error) { @@ -1080,6 +1083,7 @@ func (q *Queries) GetRandomSubscriber(ctx context.Context, key model.Subscriptio &i.Backoff, &i.MaxBackoff, &i.CatchVerb, + &i.DeploymentKey, ) return i, err } @@ -1236,9 +1240,12 @@ SELECT subs.key::subscription_key as key, curser.key as cursor, topics.key::topic_key as topic, - subs.name + subs.name, + deployments.key as deployment_key, + curser.request_key as request_key FROM topic_subscriptions subs JOIN runner_count on subs.deployment_id = runner_count.deployment + JOIN deployments ON subs.deployment_id = deployments.id LEFT JOIN topics ON subs.topic_id = topics.id LEFT JOIN topic_events curser ON subs.cursor = curser.id WHERE subs.cursor IS DISTINCT FROM topics.head @@ -1249,10 +1256,12 @@ LIMIT 3 ` type GetSubscriptionsNeedingUpdateRow struct { - Key model.SubscriptionKey - Cursor optional.Option[model.TopicEventKey] - Topic model.TopicKey - Name string + Key model.SubscriptionKey + Cursor optional.Option[model.TopicEventKey] + Topic model.TopicKey + Name string + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] } // Results may not be ready to be scheduled yet due to event consumption delay @@ -1273,6 +1282,8 @@ func (q *Queries) GetSubscriptionsNeedingUpdate(ctx context.Context) ([]GetSubsc &i.Cursor, &i.Topic, &i.Name, + &i.DeploymentKey, + &i.RequestKey, ); err != nil { return nil, err } diff --git a/backend/controller/pubsub/internal/dal/dal.go b/backend/controller/pubsub/internal/dal/dal.go index dc982a3aa7..d7b618dfb3 100644 --- a/backend/controller/pubsub/internal/dal/dal.go +++ b/backend/controller/pubsub/internal/dal/dal.go @@ -14,6 +14,7 @@ import ( "github.com/TBD54566975/ftl/backend/controller/observability" dalsql "github.com/TBD54566975/ftl/backend/controller/pubsub/internal/sql" "github.com/TBD54566975/ftl/backend/controller/sql/sqltypes" + "github.com/TBD54566975/ftl/backend/controller/timeline" "github.com/TBD54566975/ftl/backend/libdal" "github.com/TBD54566975/ftl/internal/log" "github.com/TBD54566975/ftl/internal/model" @@ -97,7 +98,7 @@ func (d *DAL) GetSubscriptionsNeedingUpdate(ctx context.Context) ([]model.Subscr }), nil } -func (d *DAL) ProgressSubscriptions(ctx context.Context, eventConsumptionDelay time.Duration) (count int, err error) { +func (d *DAL) ProgressSubscriptions(ctx context.Context, eventConsumptionDelay time.Duration, timelineSvc *timeline.Service) (count int, err error) { tx, err := d.Begin(ctx) if err != nil { return 0, fmt.Errorf("failed to begin transaction: %w", err) @@ -115,36 +116,60 @@ func (d *DAL) ProgressSubscriptions(ctx context.Context, eventConsumptionDelay t successful := 0 for _, subscription := range subs { + now := time.Now().UTC() + enqueueTimelineEvent := func(destVerb optional.Option[schema.RefKey], err optional.Option[string]) { + timelineSvc.EnqueueEvent(ctx, &timeline.PubSubConsume{ + DeploymentKey: subscription.DeploymentKey, + RequestKey: subscription.RequestKey, + Time: now, + DestVerb: destVerb, + Topic: subscription.Topic.Payload.Name, + Error: err, + }) + } + nextCursor, err := tx.db.GetNextEventForSubscription(ctx, sqltypes.Duration(eventConsumptionDelay), subscription.Topic, subscription.Cursor) if err != nil { observability.PubSub.PropagationFailed(ctx, "GetNextEventForSubscription", subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), optional.None[schema.RefKey]()) - return 0, fmt.Errorf("failed to get next cursor: %w", libdal.TranslatePGError(err)) + err = fmt.Errorf("failed to get next cursor: %w", libdal.TranslatePGError(err)) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(err.Error())) + return 0, err } payload, ok := nextCursor.Payload.Get() if !ok { observability.PubSub.PropagationFailed(ctx, "GetNextEventForSubscription-->Payload.Get", subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), optional.None[schema.RefKey]()) - return 0, fmt.Errorf("could not find payload to progress subscription: %w", libdal.TranslatePGError(err)) + err = fmt.Errorf("could not find payload to progress subscription: %w", libdal.TranslatePGError(err)) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(err.Error())) + return 0, err } nextCursorKey, ok := nextCursor.Event.Get() if !ok { observability.PubSub.PropagationFailed(ctx, "GetNextEventForSubscription-->Event.Get", subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), optional.None[schema.RefKey]()) - return 0, fmt.Errorf("could not find event to progress subscription: %w", libdal.TranslatePGError(err)) + err = fmt.Errorf("could not find event to progress subscription: %w", libdal.TranslatePGError(err)) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(err.Error())) + return 0, err } if !nextCursor.Ready { - logger.Tracef("Skipping subscription %s because event is too new", subscription.Key) + s := fmt.Sprintf("Skipping subscription %s because event is too new", subscription.Key) + logger.Tracef(s) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(s)) continue } subscriber, err := tx.db.GetRandomSubscriber(ctx, subscription.Key) if err != nil { - logger.Tracef("no subscriber for subscription %s", subscription.Key) + s := fmt.Sprintf("no subscriber for subscription %s", subscription.Key) + logger.Tracef(s) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(s)) continue } err = tx.db.BeginConsumingTopicEvent(ctx, subscription.Key, nextCursorKey) if err != nil { observability.PubSub.PropagationFailed(ctx, "BeginConsumingTopicEvent", subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), optional.Some(subscriber.Sink)) - return 0, fmt.Errorf("failed to progress subscription: %w", libdal.TranslatePGError(err)) + err = fmt.Errorf("failed to progress subscription: %w", libdal.TranslatePGError(err)) + enqueueTimelineEvent(optional.Some(subscriber.Sink), optional.Some(err.Error())) + return 0, err } origin := async.AsyncOriginPubSub{ @@ -169,10 +194,13 @@ func (d *DAL) ProgressSubscriptions(ctx context.Context, eventConsumptionDelay t observability.AsyncCalls.Created(ctx, subscriber.Sink, subscriber.CatchVerb, origin.String(), int64(subscriber.RetryAttempts), err) if err != nil { observability.PubSub.PropagationFailed(ctx, "CreateAsyncCall", subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), optional.Some(subscriber.Sink)) - return 0, fmt.Errorf("failed to schedule async task for subscription: %w", libdal.TranslatePGError(err)) + err = fmt.Errorf("failed to schedule async task for subscription: %w", libdal.TranslatePGError(err)) + enqueueTimelineEvent(optional.Some(subscriber.Sink), optional.Some(err.Error())) + return 0, err } observability.PubSub.SinkCalled(ctx, subscription.Topic.Payload, nextCursor.Caller, subscriptionRef(subscription), subscriber.Sink) + enqueueTimelineEvent(optional.Some(subscriber.Sink), optional.None[string]()) successful++ } diff --git a/backend/controller/pubsub/internal/sql/queries.sql b/backend/controller/pubsub/internal/sql/queries.sql index 84df1bc654..68e94abc16 100644 --- a/backend/controller/pubsub/internal/sql/queries.sql +++ b/backend/controller/pubsub/internal/sql/queries.sql @@ -127,9 +127,12 @@ SELECT subs.key::subscription_key as key, curser.key as cursor, topics.key::topic_key as topic, - subs.name + subs.name, + deployments.key as deployment_key, + curser.request_key as request_key FROM topic_subscriptions subs JOIN runner_count on subs.deployment_id = runner_count.deployment + JOIN deployments ON subs.deployment_id = deployments.id LEFT JOIN topics ON subs.topic_id = topics.id LEFT JOIN topic_events curser ON subs.cursor = curser.id WHERE subs.cursor IS DISTINCT FROM topics.head @@ -138,6 +141,7 @@ ORDER BY curser.created_at LIMIT 3 FOR UPDATE OF subs SKIP LOCKED; + -- name: GetNextEventForSubscription :one WITH cursor AS ( SELECT @@ -166,9 +170,11 @@ SELECT subscribers.retry_attempts as retry_attempts, subscribers.backoff as backoff, subscribers.max_backoff as max_backoff, - subscribers.catch_verb as catch_verb + subscribers.catch_verb as catch_verb, + deployments.key as deployment_key FROM topic_subscribers as subscribers JOIN topic_subscriptions ON subscribers.topic_subscriptions_id = topic_subscriptions.id + JOIN deployments ON subscribers.deployment_id = deployments.id WHERE topic_subscriptions.key = sqlc.arg('key')::subscription_key ORDER BY RANDOM() LIMIT 1; diff --git a/backend/controller/pubsub/internal/sql/queries.sql.go b/backend/controller/pubsub/internal/sql/queries.sql.go index 0f19bec87d..5bc5b786ca 100644 --- a/backend/controller/pubsub/internal/sql/queries.sql.go +++ b/backend/controller/pubsub/internal/sql/queries.sql.go @@ -171,9 +171,11 @@ SELECT subscribers.retry_attempts as retry_attempts, subscribers.backoff as backoff, subscribers.max_backoff as max_backoff, - subscribers.catch_verb as catch_verb + subscribers.catch_verb as catch_verb, + deployments.key as deployment_key FROM topic_subscribers as subscribers JOIN topic_subscriptions ON subscribers.topic_subscriptions_id = topic_subscriptions.id + JOIN deployments ON subscribers.deployment_id = deployments.id WHERE topic_subscriptions.key = $1::subscription_key ORDER BY RANDOM() LIMIT 1 @@ -185,6 +187,7 @@ type GetRandomSubscriberRow struct { Backoff sqltypes.Duration MaxBackoff sqltypes.Duration CatchVerb optional.Option[schema.RefKey] + DeploymentKey model.DeploymentKey } func (q *Queries) GetRandomSubscriber(ctx context.Context, key model.SubscriptionKey) (GetRandomSubscriberRow, error) { @@ -196,6 +199,7 @@ func (q *Queries) GetRandomSubscriber(ctx context.Context, key model.Subscriptio &i.Backoff, &i.MaxBackoff, &i.CatchVerb, + &i.DeploymentKey, ) return i, err } @@ -240,9 +244,12 @@ SELECT subs.key::subscription_key as key, curser.key as cursor, topics.key::topic_key as topic, - subs.name + subs.name, + deployments.key as deployment_key, + curser.request_key as request_key FROM topic_subscriptions subs JOIN runner_count on subs.deployment_id = runner_count.deployment + JOIN deployments ON subs.deployment_id = deployments.id LEFT JOIN topics ON subs.topic_id = topics.id LEFT JOIN topic_events curser ON subs.cursor = curser.id WHERE subs.cursor IS DISTINCT FROM topics.head @@ -253,10 +260,12 @@ LIMIT 3 ` type GetSubscriptionsNeedingUpdateRow struct { - Key model.SubscriptionKey - Cursor optional.Option[model.TopicEventKey] - Topic model.TopicKey - Name string + Key model.SubscriptionKey + Cursor optional.Option[model.TopicEventKey] + Topic model.TopicKey + Name string + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] } // Results may not be ready to be scheduled yet due to event consumption delay @@ -277,6 +286,8 @@ func (q *Queries) GetSubscriptionsNeedingUpdate(ctx context.Context) ([]GetSubsc &i.Cursor, &i.Topic, &i.Name, + &i.DeploymentKey, + &i.RequestKey, ); err != nil { return nil, err } diff --git a/backend/controller/pubsub/service.go b/backend/controller/pubsub/service.go index 66b9202fc9..8e98b4f1a4 100644 --- a/backend/controller/pubsub/service.go +++ b/backend/controller/pubsub/service.go @@ -13,6 +13,7 @@ import ( "github.com/TBD54566975/ftl/backend/controller/encryption" "github.com/TBD54566975/ftl/backend/controller/pubsub/internal/dal" "github.com/TBD54566975/ftl/backend/controller/scheduledtask" + "github.com/TBD54566975/ftl/backend/controller/timeline" "github.com/TBD54566975/ftl/backend/libdal" "github.com/TBD54566975/ftl/internal/log" "github.com/TBD54566975/ftl/internal/model" @@ -39,13 +40,15 @@ type Service struct { dal *dal.DAL asyncCallListener optional.Option[AsyncCallListener] eventPublished chan struct{} + timelineSvc *timeline.Service } -func New(ctx context.Context, conn libdal.Connection, encryption *encryption.Service, asyncCallListener optional.Option[AsyncCallListener]) *Service { +func New(ctx context.Context, conn libdal.Connection, encryption *encryption.Service, asyncCallListener optional.Option[AsyncCallListener], timeline *timeline.Service) *Service { m := &Service{ dal: dal.New(conn, encryption), asyncCallListener: asyncCallListener, eventPublished: make(chan struct{}), + timelineSvc: timeline, } go m.poll(ctx) return m @@ -90,7 +93,7 @@ func (s *Service) poll(ctx context.Context) { } func (s *Service) progressSubscriptions(ctx context.Context) error { - count, err := s.dal.ProgressSubscriptions(ctx, eventConsumptionDelay) + count, err := s.dal.ProgressSubscriptions(ctx, eventConsumptionDelay, s.timelineSvc) if err != nil { return fmt.Errorf("progress subscriptions: %w", err) } diff --git a/backend/controller/sql/schema/20241101215338_timeline_pubsub_events.sql b/backend/controller/sql/schema/20241101215338_timeline_pubsub_events.sql new file mode 100644 index 0000000000..fad43e1b5b --- /dev/null +++ b/backend/controller/sql/schema/20241101215338_timeline_pubsub_events.sql @@ -0,0 +1,6 @@ +-- migrate:up + +ALTER TYPE event_type ADD VALUE IF NOT EXISTS 'pubsub_publish'; +ALTER TYPE event_type ADD VALUE IF NOT EXISTS 'pubsub_consume'; + +-- migrate:down diff --git a/backend/controller/timeline/events_pubsub_consume.go b/backend/controller/timeline/events_pubsub_consume.go new file mode 100644 index 0000000000..881f45b380 --- /dev/null +++ b/backend/controller/timeline/events_pubsub_consume.go @@ -0,0 +1,87 @@ +package timeline + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/alecthomas/types/optional" + + ftlencryption "github.com/TBD54566975/ftl/backend/controller/encryption/api" + "github.com/TBD54566975/ftl/backend/controller/timeline/internal/sql" + "github.com/TBD54566975/ftl/backend/libdal" + "github.com/TBD54566975/ftl/internal/model" + "github.com/TBD54566975/ftl/internal/schema" +) + +type PubSubConsumeEvent struct { + ID int64 + Duration time.Duration + PubSubConsume +} + +func (e *PubSubConsumeEvent) GetID() int64 { return e.ID } +func (e *PubSubConsumeEvent) event() {} + +type PubSubConsume struct { + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] + Time time.Time + DestVerb optional.Option[schema.RefKey] + Topic string + Error optional.Option[string] +} + +func (e *PubSubConsume) toEvent() (Event, error) { + return &PubSubConsumeEvent{ + PubSubConsume: *e, + Duration: time.Since(e.Time), + }, nil +} + +type eventPubSubConsumeJSON struct { + DurationMS int64 `json:"duration_ms"` + Topic string `json:"topic"` + Error optional.Option[string] `json:"error,omitempty"` +} + +func (s *Service) insertPubSubConsumeEvent(ctx context.Context, querier sql.Querier, event *PubSubConsumeEvent) error { + pubsubJSON := eventPubSubConsumeJSON{ + DurationMS: event.Duration.Milliseconds(), + Topic: event.Topic, + Error: event.Error, + } + + data, err := json.Marshal(pubsubJSON) + if err != nil { + return fmt.Errorf("failed to marshal pubsub event: %w", err) + } + + var payload ftlencryption.EncryptedTimelineColumn + err = s.encryption.EncryptJSON(json.RawMessage(data), &payload) + if err != nil { + return fmt.Errorf("failed to encrypt cron JSON: %w", err) + } + + destModule := optional.None[string]() + destVerb := optional.None[string]() + if dv, ok := event.DestVerb.Get(); ok { + destModule = optional.Some(dv.Module) + destVerb = optional.Some(dv.Name) + } + + err = libdal.TranslatePGError(querier.InsertTimelinePubsubConsumeEvent(ctx, sql.InsertTimelinePubsubConsumeEventParams{ + DeploymentKey: event.DeploymentKey, + RequestKey: event.RequestKey, + TimeStamp: event.Time, + DestModule: destModule, + DestVerb: destVerb, + Topic: event.Topic, + Payload: payload, + })) + if err != nil { + return fmt.Errorf("failed to insert pubsub consume event: %w", err) + } + return err +} diff --git a/backend/controller/timeline/events_pubsub_publish.go b/backend/controller/timeline/events_pubsub_publish.go new file mode 100644 index 0000000000..336b15a863 --- /dev/null +++ b/backend/controller/timeline/events_pubsub_publish.go @@ -0,0 +1,85 @@ +package timeline + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/alecthomas/types/optional" + + ftlencryption "github.com/TBD54566975/ftl/backend/controller/encryption/api" + "github.com/TBD54566975/ftl/backend/controller/timeline/internal/sql" + "github.com/TBD54566975/ftl/backend/libdal" + ftlv1 "github.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1" + "github.com/TBD54566975/ftl/internal/model" + "github.com/TBD54566975/ftl/internal/schema" +) + +type PubSubPublishEvent struct { + ID int64 + Duration time.Duration + Request json.RawMessage + PubSubPublish +} + +func (e *PubSubPublishEvent) GetID() int64 { return e.ID } +func (e *PubSubPublishEvent) event() {} + +type PubSubPublish struct { + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] + Time time.Time + SourceVerb schema.Ref + Topic string + Request *ftlv1.PublishEventRequest + Error optional.Option[string] +} + +func (e *PubSubPublish) toEvent() (Event, error) { + return &PubSubPublishEvent{ + PubSubPublish: *e, + Duration: time.Since(e.Time), + }, nil +} + +type eventPubSubPublishJSON struct { + DurationMS int64 `json:"duration_ms"` + Topic string `json:"topic"` + Request json.RawMessage `json:"request"` + Error optional.Option[string] `json:"error,omitempty"` +} + +func (s *Service) insertPubSubPublishEvent(ctx context.Context, querier sql.Querier, event *PubSubPublishEvent) error { + pubsubJSON := eventPubSubPublishJSON{ + DurationMS: event.Duration.Milliseconds(), + Topic: event.Topic, + Request: event.Request, + Error: event.Error, + } + + data, err := json.Marshal(pubsubJSON) + if err != nil { + return fmt.Errorf("failed to marshal pubsub event: %w", err) + } + + var payload ftlencryption.EncryptedTimelineColumn + err = s.encryption.EncryptJSON(json.RawMessage(data), &payload) + if err != nil { + return fmt.Errorf("failed to encrypt cron JSON: %w", err) + } + + err = libdal.TranslatePGError(querier.InsertTimelinePubsubPublishEvent(ctx, sql.InsertTimelinePubsubPublishEventParams{ + DeploymentKey: event.DeploymentKey, + RequestKey: event.RequestKey, + TimeStamp: event.Time, + SourceModule: event.SourceVerb.Module, + SourceVerb: event.SourceVerb.Name, + Topic: event.Topic, + Payload: payload, + })) + if err != nil { + return fmt.Errorf("failed to insert pubsub publish event: %w", err) + } + return err +} diff --git a/backend/controller/timeline/internal/sql/models.go b/backend/controller/timeline/internal/sql/models.go index 610219ad2a..90b3f40fb4 100644 --- a/backend/controller/timeline/internal/sql/models.go +++ b/backend/controller/timeline/internal/sql/models.go @@ -23,6 +23,8 @@ const ( EventTypeIngress EventType = "ingress" EventTypeCronScheduled EventType = "cron_scheduled" EventTypeAsyncExecute EventType = "async_execute" + EventTypePubsubPublish EventType = "pubsub_publish" + EventTypePubsubConsume EventType = "pubsub_consume" ) func (e *EventType) Scan(src interface{}) error { diff --git a/backend/controller/timeline/internal/sql/querier.go b/backend/controller/timeline/internal/sql/querier.go index 5ea251954c..ad15ffef67 100644 --- a/backend/controller/timeline/internal/sql/querier.go +++ b/backend/controller/timeline/internal/sql/querier.go @@ -21,6 +21,8 @@ type Querier interface { InsertTimelineDeploymentUpdatedEvent(ctx context.Context, arg InsertTimelineDeploymentUpdatedEventParams) error InsertTimelineIngressEvent(ctx context.Context, arg InsertTimelineIngressEventParams) error InsertTimelineLogEvent(ctx context.Context, arg InsertTimelineLogEventParams) error + InsertTimelinePubsubConsumeEvent(ctx context.Context, arg InsertTimelinePubsubConsumeEventParams) error + InsertTimelinePubsubPublishEvent(ctx context.Context, arg InsertTimelinePubsubPublishEventParams) error } var _ Querier = (*Queries)(nil) diff --git a/backend/controller/timeline/internal/sql/queries.sql b/backend/controller/timeline/internal/sql/queries.sql index e130b14266..2eee3cdfdf 100644 --- a/backend/controller/timeline/internal/sql/queries.sql +++ b/backend/controller/timeline/internal/sql/queries.sql @@ -121,6 +121,56 @@ VALUES ( sqlc.arg('payload') ); +-- name: InsertTimelinePubsubPublishEvent :exec +INSERT INTO timeline ( + deployment_id, + request_id, + time_stamp, + type, + custom_key_1, + custom_key_2, + custom_key_3, + payload +) +VALUES ( + (SELECT id FROM deployments d WHERE d.key = sqlc.arg('deployment_key')::deployment_key LIMIT 1), + (CASE + WHEN sqlc.narg('request_key')::TEXT IS NULL THEN NULL + ELSE (SELECT id FROM requests ir WHERE ir.key = sqlc.narg('request_key')::TEXT) + END), + sqlc.arg('time_stamp')::TIMESTAMPTZ, + 'pubsub_publish', + sqlc.arg('source_module')::TEXT, + sqlc.arg('source_verb')::TEXT, + sqlc.arg('topic')::TEXT, + sqlc.arg('payload') +); + +-- name: InsertTimelinePubsubConsumeEvent :exec +INSERT INTO timeline ( + deployment_id, + request_id, + time_stamp, + type, + custom_key_1, + custom_key_2, + custom_key_3, + payload +) +VALUES ( + (SELECT id FROM deployments d WHERE d.key = sqlc.arg('deployment_key')::deployment_key LIMIT 1), + (CASE + WHEN sqlc.narg('request_key')::TEXT IS NULL THEN NULL + ELSE (SELECT id FROM requests ir WHERE ir.key = sqlc.narg('request_key')::TEXT) + END), + sqlc.arg('time_stamp')::TIMESTAMPTZ, + 'pubsub_consume', + sqlc.narg('dest_module')::TEXT, + sqlc.narg('dest_verb')::TEXT, + sqlc.arg('topic')::TEXT, + sqlc.arg('payload') +); + -- name: DeleteOldTimelineEvents :one WITH deleted AS ( DELETE FROM timeline diff --git a/backend/controller/timeline/internal/sql/queries.sql.go b/backend/controller/timeline/internal/sql/queries.sql.go index 7493bd2812..6ea635a67f 100644 --- a/backend/controller/timeline/internal/sql/queries.sql.go +++ b/backend/controller/timeline/internal/sql/queries.sql.go @@ -293,3 +293,101 @@ func (q *Queries) InsertTimelineLogEvent(ctx context.Context, arg InsertTimeline ) return err } + +const insertTimelinePubsubConsumeEvent = `-- name: InsertTimelinePubsubConsumeEvent :exec +INSERT INTO timeline ( + deployment_id, + request_id, + time_stamp, + type, + custom_key_1, + custom_key_2, + custom_key_3, + payload +) +VALUES ( + (SELECT id FROM deployments d WHERE d.key = $1::deployment_key LIMIT 1), + (CASE + WHEN $2::TEXT IS NULL THEN NULL + ELSE (SELECT id FROM requests ir WHERE ir.key = $2::TEXT) + END), + $3::TIMESTAMPTZ, + 'pubsub_consume', + $4::TEXT, + $5::TEXT, + $6::TEXT, + $7 +) +` + +type InsertTimelinePubsubConsumeEventParams struct { + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] + TimeStamp time.Time + DestModule optional.Option[string] + DestVerb optional.Option[string] + Topic string + Payload api.EncryptedTimelineColumn +} + +func (q *Queries) InsertTimelinePubsubConsumeEvent(ctx context.Context, arg InsertTimelinePubsubConsumeEventParams) error { + _, err := q.db.ExecContext(ctx, insertTimelinePubsubConsumeEvent, + arg.DeploymentKey, + arg.RequestKey, + arg.TimeStamp, + arg.DestModule, + arg.DestVerb, + arg.Topic, + arg.Payload, + ) + return err +} + +const insertTimelinePubsubPublishEvent = `-- name: InsertTimelinePubsubPublishEvent :exec +INSERT INTO timeline ( + deployment_id, + request_id, + time_stamp, + type, + custom_key_1, + custom_key_2, + custom_key_3, + payload +) +VALUES ( + (SELECT id FROM deployments d WHERE d.key = $1::deployment_key LIMIT 1), + (CASE + WHEN $2::TEXT IS NULL THEN NULL + ELSE (SELECT id FROM requests ir WHERE ir.key = $2::TEXT) + END), + $3::TIMESTAMPTZ, + 'pubsub_publish', + $4::TEXT, + $5::TEXT, + $6::TEXT, + $7 +) +` + +type InsertTimelinePubsubPublishEventParams struct { + DeploymentKey model.DeploymentKey + RequestKey optional.Option[string] + TimeStamp time.Time + SourceModule string + SourceVerb string + Topic string + Payload api.EncryptedTimelineColumn +} + +func (q *Queries) InsertTimelinePubsubPublishEvent(ctx context.Context, arg InsertTimelinePubsubPublishEventParams) error { + _, err := q.db.ExecContext(ctx, insertTimelinePubsubPublishEvent, + arg.DeploymentKey, + arg.RequestKey, + arg.TimeStamp, + arg.SourceModule, + arg.SourceVerb, + arg.Topic, + arg.Payload, + ) + return err +} diff --git a/backend/controller/timeline/internal/timeline_test.go b/backend/controller/timeline/internal/timeline_test.go index fdb61f83af..eee7b3a72b 100644 --- a/backend/controller/timeline/internal/timeline_test.go +++ b/backend/controller/timeline/internal/timeline_test.go @@ -36,7 +36,7 @@ func TestTimeline(t *testing.T) { timeline := timeline2.New(ctx, conn, encryption) registry := artefacts.New(conn) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timeline) key := model.NewControllerKey("localhost", strconv.Itoa(8080+1)) cjs := cronjobs.New(ctx, key, "test.com", encryption, timeline, conn) @@ -186,6 +186,53 @@ func TestTimeline(t *testing.T) { time.Sleep(200 * time.Millisecond) }) + pubSubPublishEvent := &timeline2.PubSubPublishEvent{ + Request: []byte("null"), + PubSubPublish: timeline2.PubSubPublish{ + DeploymentKey: deploymentKey, + RequestKey: optional.Some(requestKey.String()), + Time: time.Now().Round(time.Millisecond), + SourceVerb: schema.Ref{Module: "time", Name: "time"}, + Topic: "test", + Error: optional.None[string](), + }, + } + + t.Run("InsertPubSubPublishEvent", func(t *testing.T) { + timeline.EnqueueEvent(ctx, &timeline2.PubSubPublish{ + DeploymentKey: pubSubPublishEvent.DeploymentKey, + RequestKey: pubSubPublishEvent.RequestKey, + Time: pubSubPublishEvent.Time, + SourceVerb: pubSubPublishEvent.SourceVerb, + Topic: pubSubPublishEvent.Topic, + Error: pubSubPublishEvent.Error, + }) + time.Sleep(200 * time.Millisecond) + }) + + pubSubConsumeEvent := &timeline2.PubSubConsumeEvent{ + PubSubConsume: timeline2.PubSubConsume{ + DeploymentKey: deploymentKey, + RequestKey: optional.Some(requestKey.String()), + Time: time.Now().Round(time.Millisecond), + DestVerb: optional.Some(schema.RefKey{Module: "time", Name: "time"}), + Topic: "test", + Error: optional.None[string](), + }, + } + + t.Run("InsertPubSubConsumeEvent", func(t *testing.T) { + timeline.EnqueueEvent(ctx, &timeline2.PubSubConsume{ + DeploymentKey: pubSubConsumeEvent.DeploymentKey, + RequestKey: pubSubConsumeEvent.RequestKey, + Time: pubSubConsumeEvent.Time, + DestVerb: pubSubConsumeEvent.DestVerb, + Topic: pubSubConsumeEvent.Topic, + Error: pubSubConsumeEvent.Error, + }) + time.Sleep(200 * time.Millisecond) + }) + expectedDeploymentUpdatedEvent := &timeline2.DeploymentUpdatedEvent{ DeploymentKey: deploymentKey, MinReplicas: 1, @@ -201,13 +248,13 @@ func TestTimeline(t *testing.T) { t.Run("NoFilters", func(t *testing.T) { events, err := timeline.QueryTimeline(ctx, 1000) assert.NoError(t, err) - assertEventsEqual(t, []timeline2.Event{expectedDeploymentUpdatedEvent, callEvent, logEvent, ingressEvent, cronEvent, asyncEvent}, events) + assertEventsEqual(t, []timeline2.Event{expectedDeploymentUpdatedEvent, callEvent, logEvent, ingressEvent, cronEvent, asyncEvent, pubSubPublishEvent, pubSubConsumeEvent}, events) }) t.Run("ByDeployment", func(t *testing.T) { events, err := timeline.QueryTimeline(ctx, 1000, timeline2.FilterDeployments(deploymentKey)) assert.NoError(t, err) - assertEventsEqual(t, []timeline2.Event{expectedDeploymentUpdatedEvent, callEvent, logEvent, ingressEvent, cronEvent, asyncEvent}, events) + assertEventsEqual(t, []timeline2.Event{expectedDeploymentUpdatedEvent, callEvent, logEvent, ingressEvent, cronEvent, asyncEvent, pubSubPublishEvent, pubSubConsumeEvent}, events) }) t.Run("ByCall", func(t *testing.T) { @@ -237,7 +284,7 @@ func TestTimeline(t *testing.T) { t.Run("ByRequests", func(t *testing.T) { events, err := timeline.QueryTimeline(ctx, 1000, timeline2.FilterRequests(requestKey)) assert.NoError(t, err) - assertEventsEqual(t, []timeline2.Event{callEvent, logEvent, ingressEvent, asyncEvent}, events) + assertEventsEqual(t, []timeline2.Event{callEvent, logEvent, ingressEvent, asyncEvent, pubSubPublishEvent, pubSubConsumeEvent}, events) }) }) } @@ -269,7 +316,7 @@ func TestDeleteOldEvents(t *testing.T) { timeline := timeline2.New(ctx, conn, encryption) registry := artefacts.New(conn) - pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener]()) + pubSub := pubsub.New(ctx, conn, encryption, optional.None[pubsub.AsyncCallListener](), timeline) controllerDAL := controllerdal.New(ctx, conn, encryption, pubSub, nil) var testContent = bytes.Repeat([]byte("sometestcontentthatislongerthanthereadbuffer"), 100) diff --git a/backend/controller/timeline/query.go b/backend/controller/timeline/query.go index 7ee650877d..e18ca216bd 100644 --- a/backend/controller/timeline/query.go +++ b/backend/controller/timeline/query.go @@ -411,6 +411,60 @@ func (s *Service) transformRowsToTimelineEvents(deploymentKeys map[int64]model.D }, }) + case sql.EventTypePubsubPublish: + var jsonPayload eventPubSubPublishJSON + if err := s.encryption.DecryptJSON(&row.Payload, &jsonPayload); err != nil { + return nil, fmt.Errorf("failed to decrypt pubsub publish event: %w", err) + } + requestKey := optional.None[string]() + if rk, ok := row.RequestKey.Get(); ok { + requestKey = optional.Some(rk.String()) + } + out = append(out, &PubSubPublishEvent{ + ID: row.ID, + Duration: time.Duration(jsonPayload.DurationMS) * time.Millisecond, + Request: jsonPayload.Request, + PubSubPublish: PubSubPublish{ + DeploymentKey: row.DeploymentKey, + RequestKey: requestKey, + Time: row.TimeStamp, + SourceVerb: schema.Ref{Module: row.CustomKey1.MustGet(), Name: row.CustomKey2.MustGet()}, + Topic: jsonPayload.Topic, + Error: jsonPayload.Error, + }, + }) + + case sql.EventTypePubsubConsume: + var jsonPayload eventPubSubConsumeJSON + if err := s.encryption.DecryptJSON(&row.Payload, &jsonPayload); err != nil { + return nil, fmt.Errorf("failed to decrypt pubsub consume event: %w", err) + } + requestKey := optional.None[string]() + if rk, ok := row.RequestKey.Get(); ok { + requestKey = optional.Some(rk.String()) + } + destVerb := optional.None[schema.RefKey]() + if dv, ok := row.CustomKey2.Get(); ok { + dvr := schema.RefKey{Name: dv} + dm, ok := row.CustomKey1.Get() + if ok { + dvr.Module = dm + } + destVerb = optional.Some(dvr) + } + out = append(out, &PubSubConsumeEvent{ + ID: row.ID, + Duration: time.Since(row.TimeStamp), + PubSubConsume: PubSubConsume{ + DeploymentKey: row.DeploymentKey, + RequestKey: requestKey, + Time: row.TimeStamp, + DestVerb: destVerb, + Topic: jsonPayload.Topic, + Error: jsonPayload.Error, + }, + }) + default: panic("unknown event type: " + row.Type) } diff --git a/backend/controller/timeline/timeline.go b/backend/controller/timeline/timeline.go index ad48520ece..4220c04837 100644 --- a/backend/controller/timeline/timeline.go +++ b/backend/controller/timeline/timeline.go @@ -27,6 +27,8 @@ const ( EventTypeIngress = sql.EventTypeIngress EventTypeCronScheduled = sql.EventTypeCronScheduled EventTypeAsyncExecute = sql.EventTypeAsyncExecute + EventTypePubSubPublish = sql.EventTypePubsubPublish + EventTypePubSubConsume = sql.EventTypePubsubConsume maxBatchSize = 16 maxBatchDelay = 100 * time.Millisecond @@ -137,6 +139,10 @@ func (s *Service) flushEvents(events []Event) { err = s.insertCronScheduledEvent(s.ctx, querier, e) case *AsyncExecuteEvent: err = s.insertAsyncExecuteEvent(s.ctx, querier, e) + case *PubSubPublishEvent: + err = s.insertPubSubPublishEvent(s.ctx, querier, e) + case *PubSubConsumeEvent: + err = s.insertPubSubConsumeEvent(s.ctx, querier, e) case *DeploymentCreatedEvent, *DeploymentUpdatedEvent: // TODO: Implement default: diff --git a/backend/protos/xyz/block/ftl/v1/console/console.pb.go b/backend/protos/xyz/block/ftl/v1/console/console.pb.go index 3fc1869e6d..c24f0b6424 100644 --- a/backend/protos/xyz/block/ftl/v1/console/console.pb.go +++ b/backend/protos/xyz/block/ftl/v1/console/console.pb.go @@ -35,6 +35,8 @@ const ( EventType_EVENT_TYPE_INGRESS EventType = 5 EventType_EVENT_TYPE_CRON_SCHEDULED EventType = 6 EventType_EVENT_TYPE_ASYNC_EXECUTE EventType = 7 + EventType_EVENT_TYPE_PUBSUB_PUBLISH EventType = 8 + EventType_EVENT_TYPE_PUBSUB_CONSUME EventType = 9 ) // Enum value maps for EventType. @@ -48,6 +50,8 @@ var ( 5: "EVENT_TYPE_INGRESS", 6: "EVENT_TYPE_CRON_SCHEDULED", 7: "EVENT_TYPE_ASYNC_EXECUTE", + 8: "EVENT_TYPE_PUBSUB_PUBLISH", + 9: "EVENT_TYPE_PUBSUB_CONSUME", } EventType_value = map[string]int32{ "EVENT_TYPE_UNKNOWN": 0, @@ -58,6 +62,8 @@ var ( "EVENT_TYPE_INGRESS": 5, "EVENT_TYPE_CRON_SCHEDULED": 6, "EVENT_TYPE_ASYNC_EXECUTE": 7, + "EVENT_TYPE_PUBSUB_PUBLISH": 8, + "EVENT_TYPE_PUBSUB_CONSUME": 9, } ) @@ -238,7 +244,7 @@ func (x EventsQuery_Order) Number() protoreflect.EnumNumber { // Deprecated: Use EventsQuery_Order.Descriptor instead. func (EventsQuery_Order) EnumDescriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 0} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 0} } type LogEvent struct { @@ -924,6 +930,208 @@ func (x *AsyncExecuteEvent) GetError() string { return "" } +type PubSubPublishEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeploymentKey string `protobuf:"bytes,1,opt,name=deployment_key,json=deploymentKey,proto3" json:"deployment_key,omitempty"` + RequestKey *string `protobuf:"bytes,2,opt,name=request_key,json=requestKey,proto3,oneof" json:"request_key,omitempty"` + VerbRef *schema.Ref `protobuf:"bytes,3,opt,name=verb_ref,json=verbRef,proto3" json:"verb_ref,omitempty"` + TimeStamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"` + Duration *durationpb.Duration `protobuf:"bytes,5,opt,name=duration,proto3" json:"duration,omitempty"` + Topic string `protobuf:"bytes,6,opt,name=topic,proto3" json:"topic,omitempty"` + Request string `protobuf:"bytes,7,opt,name=request,proto3" json:"request,omitempty"` + Error *string `protobuf:"bytes,8,opt,name=error,proto3,oneof" json:"error,omitempty"` +} + +func (x *PubSubPublishEvent) Reset() { + *x = PubSubPublishEvent{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PubSubPublishEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PubSubPublishEvent) ProtoMessage() {} + +func (x *PubSubPublishEvent) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PubSubPublishEvent.ProtoReflect.Descriptor instead. +func (*PubSubPublishEvent) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{7} +} + +func (x *PubSubPublishEvent) GetDeploymentKey() string { + if x != nil { + return x.DeploymentKey + } + return "" +} + +func (x *PubSubPublishEvent) GetRequestKey() string { + if x != nil && x.RequestKey != nil { + return *x.RequestKey + } + return "" +} + +func (x *PubSubPublishEvent) GetVerbRef() *schema.Ref { + if x != nil { + return x.VerbRef + } + return nil +} + +func (x *PubSubPublishEvent) GetTimeStamp() *timestamppb.Timestamp { + if x != nil { + return x.TimeStamp + } + return nil +} + +func (x *PubSubPublishEvent) GetDuration() *durationpb.Duration { + if x != nil { + return x.Duration + } + return nil +} + +func (x *PubSubPublishEvent) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *PubSubPublishEvent) GetRequest() string { + if x != nil { + return x.Request + } + return "" +} + +func (x *PubSubPublishEvent) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" +} + +type PubSubConsumeEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeploymentKey string `protobuf:"bytes,1,opt,name=deployment_key,json=deploymentKey,proto3" json:"deployment_key,omitempty"` + RequestKey *string `protobuf:"bytes,2,opt,name=request_key,json=requestKey,proto3,oneof" json:"request_key,omitempty"` + DestVerbModule *string `protobuf:"bytes,3,opt,name=dest_verb_module,json=destVerbModule,proto3,oneof" json:"dest_verb_module,omitempty"` + DestVerbName *string `protobuf:"bytes,4,opt,name=dest_verb_name,json=destVerbName,proto3,oneof" json:"dest_verb_name,omitempty"` + TimeStamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"` + Duration *durationpb.Duration `protobuf:"bytes,6,opt,name=duration,proto3" json:"duration,omitempty"` + Topic string `protobuf:"bytes,7,opt,name=topic,proto3" json:"topic,omitempty"` + Error *string `protobuf:"bytes,8,opt,name=error,proto3,oneof" json:"error,omitempty"` +} + +func (x *PubSubConsumeEvent) Reset() { + *x = PubSubConsumeEvent{} + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PubSubConsumeEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PubSubConsumeEvent) ProtoMessage() {} + +func (x *PubSubConsumeEvent) ProtoReflect() protoreflect.Message { + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PubSubConsumeEvent.ProtoReflect.Descriptor instead. +func (*PubSubConsumeEvent) Descriptor() ([]byte, []int) { + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{8} +} + +func (x *PubSubConsumeEvent) GetDeploymentKey() string { + if x != nil { + return x.DeploymentKey + } + return "" +} + +func (x *PubSubConsumeEvent) GetRequestKey() string { + if x != nil && x.RequestKey != nil { + return *x.RequestKey + } + return "" +} + +func (x *PubSubConsumeEvent) GetDestVerbModule() string { + if x != nil && x.DestVerbModule != nil { + return *x.DestVerbModule + } + return "" +} + +func (x *PubSubConsumeEvent) GetDestVerbName() string { + if x != nil && x.DestVerbName != nil { + return *x.DestVerbName + } + return "" +} + +func (x *PubSubConsumeEvent) GetTimeStamp() *timestamppb.Timestamp { + if x != nil { + return x.TimeStamp + } + return nil +} + +func (x *PubSubConsumeEvent) GetDuration() *durationpb.Duration { + if x != nil { + return x.Duration + } + return nil +} + +func (x *PubSubConsumeEvent) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *PubSubConsumeEvent) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" +} + type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -935,7 +1143,7 @@ type Config struct { func (x *Config) Reset() { *x = Config{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[7] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +1155,7 @@ func (x *Config) String() string { func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[7] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,7 +1168,7 @@ func (x *Config) ProtoReflect() protoreflect.Message { // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{7} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{9} } func (x *Config) GetConfig() *schema.Config { @@ -989,7 +1197,7 @@ type Data struct { func (x *Data) Reset() { *x = Data{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[8] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1001,7 +1209,7 @@ func (x *Data) String() string { func (*Data) ProtoMessage() {} func (x *Data) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[8] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1014,7 +1222,7 @@ func (x *Data) ProtoReflect() protoreflect.Message { // Deprecated: Use Data.ProtoReflect.Descriptor instead. func (*Data) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{8} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{10} } func (x *Data) GetData() *schema.Data { @@ -1049,7 +1257,7 @@ type Database struct { func (x *Database) Reset() { *x = Database{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[9] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1061,7 +1269,7 @@ func (x *Database) String() string { func (*Database) ProtoMessage() {} func (x *Database) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[9] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1074,7 +1282,7 @@ func (x *Database) ProtoReflect() protoreflect.Message { // Deprecated: Use Database.ProtoReflect.Descriptor instead. func (*Database) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{9} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{11} } func (x *Database) GetDatabase() *schema.Database { @@ -1102,7 +1310,7 @@ type Enum struct { func (x *Enum) Reset() { *x = Enum{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[10] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1114,7 +1322,7 @@ func (x *Enum) String() string { func (*Enum) ProtoMessage() {} func (x *Enum) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[10] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1127,7 +1335,7 @@ func (x *Enum) ProtoReflect() protoreflect.Message { // Deprecated: Use Enum.ProtoReflect.Descriptor instead. func (*Enum) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{10} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12} } func (x *Enum) GetEnum() *schema.Enum { @@ -1155,7 +1363,7 @@ type Topic struct { func (x *Topic) Reset() { *x = Topic{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[11] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1167,7 +1375,7 @@ func (x *Topic) String() string { func (*Topic) ProtoMessage() {} func (x *Topic) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[11] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1180,7 +1388,7 @@ func (x *Topic) ProtoReflect() protoreflect.Message { // Deprecated: Use Topic.ProtoReflect.Descriptor instead. func (*Topic) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{11} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{13} } func (x *Topic) GetTopic() *schema.Topic { @@ -1208,7 +1416,7 @@ type TypeAlias struct { func (x *TypeAlias) Reset() { *x = TypeAlias{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[12] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1220,7 +1428,7 @@ func (x *TypeAlias) String() string { func (*TypeAlias) ProtoMessage() {} func (x *TypeAlias) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[12] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1233,7 +1441,7 @@ func (x *TypeAlias) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeAlias.ProtoReflect.Descriptor instead. func (*TypeAlias) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{12} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{14} } func (x *TypeAlias) GetTypealias() *schema.TypeAlias { @@ -1261,7 +1469,7 @@ type Secret struct { func (x *Secret) Reset() { *x = Secret{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[13] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1273,7 +1481,7 @@ func (x *Secret) String() string { func (*Secret) ProtoMessage() {} func (x *Secret) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[13] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1286,7 +1494,7 @@ func (x *Secret) ProtoReflect() protoreflect.Message { // Deprecated: Use Secret.ProtoReflect.Descriptor instead. func (*Secret) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{13} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{15} } func (x *Secret) GetSecret() *schema.Secret { @@ -1314,7 +1522,7 @@ type Subscription struct { func (x *Subscription) Reset() { *x = Subscription{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[14] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1326,7 +1534,7 @@ func (x *Subscription) String() string { func (*Subscription) ProtoMessage() {} func (x *Subscription) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[14] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1339,7 +1547,7 @@ func (x *Subscription) ProtoReflect() protoreflect.Message { // Deprecated: Use Subscription.ProtoReflect.Descriptor instead. func (*Subscription) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{14} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{16} } func (x *Subscription) GetSubscription() *schema.Subscription { @@ -1369,7 +1577,7 @@ type Verb struct { func (x *Verb) Reset() { *x = Verb{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[15] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1381,7 +1589,7 @@ func (x *Verb) String() string { func (*Verb) ProtoMessage() {} func (x *Verb) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[15] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1394,7 +1602,7 @@ func (x *Verb) ProtoReflect() protoreflect.Message { // Deprecated: Use Verb.ProtoReflect.Descriptor instead. func (*Verb) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{15} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{17} } func (x *Verb) GetVerb() *schema.Verb { @@ -1447,7 +1655,7 @@ type Module struct { func (x *Module) Reset() { *x = Module{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1459,7 +1667,7 @@ func (x *Module) String() string { func (*Module) ProtoMessage() {} func (x *Module) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[16] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1472,7 +1680,7 @@ func (x *Module) ProtoReflect() protoreflect.Message { // Deprecated: Use Module.ProtoReflect.Descriptor instead. func (*Module) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{16} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{18} } func (x *Module) GetName() string { @@ -1576,7 +1784,7 @@ type TopologyGroup struct { func (x *TopologyGroup) Reset() { *x = TopologyGroup{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1588,7 +1796,7 @@ func (x *TopologyGroup) String() string { func (*TopologyGroup) ProtoMessage() {} func (x *TopologyGroup) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[17] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1601,7 +1809,7 @@ func (x *TopologyGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyGroup.ProtoReflect.Descriptor instead. func (*TopologyGroup) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{17} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{19} } func (x *TopologyGroup) GetModules() []string { @@ -1621,7 +1829,7 @@ type Topology struct { func (x *Topology) Reset() { *x = Topology{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1633,7 +1841,7 @@ func (x *Topology) String() string { func (*Topology) ProtoMessage() {} func (x *Topology) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[18] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1646,7 +1854,7 @@ func (x *Topology) ProtoReflect() protoreflect.Message { // Deprecated: Use Topology.ProtoReflect.Descriptor instead. func (*Topology) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{18} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{20} } func (x *Topology) GetLevels() []*TopologyGroup { @@ -1664,7 +1872,7 @@ type GetModulesRequest struct { func (x *GetModulesRequest) Reset() { *x = GetModulesRequest{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1676,7 +1884,7 @@ func (x *GetModulesRequest) String() string { func (*GetModulesRequest) ProtoMessage() {} func (x *GetModulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[19] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1689,7 +1897,7 @@ func (x *GetModulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetModulesRequest.ProtoReflect.Descriptor instead. func (*GetModulesRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{19} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{21} } type GetModulesResponse struct { @@ -1703,7 +1911,7 @@ type GetModulesResponse struct { func (x *GetModulesResponse) Reset() { *x = GetModulesResponse{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1715,7 +1923,7 @@ func (x *GetModulesResponse) String() string { func (*GetModulesResponse) ProtoMessage() {} func (x *GetModulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[20] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1728,7 +1936,7 @@ func (x *GetModulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetModulesResponse.ProtoReflect.Descriptor instead. func (*GetModulesResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{20} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{22} } func (x *GetModulesResponse) GetModules() []*Module { @@ -1753,7 +1961,7 @@ type StreamModulesRequest struct { func (x *StreamModulesRequest) Reset() { *x = StreamModulesRequest{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1765,7 +1973,7 @@ func (x *StreamModulesRequest) String() string { func (*StreamModulesRequest) ProtoMessage() {} func (x *StreamModulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[21] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1778,7 +1986,7 @@ func (x *StreamModulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamModulesRequest.ProtoReflect.Descriptor instead. func (*StreamModulesRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{21} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23} } type StreamModulesResponse struct { @@ -1791,7 +1999,7 @@ type StreamModulesResponse struct { func (x *StreamModulesResponse) Reset() { *x = StreamModulesResponse{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1803,7 +2011,7 @@ func (x *StreamModulesResponse) String() string { func (*StreamModulesResponse) ProtoMessage() {} func (x *StreamModulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[22] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1816,7 +2024,7 @@ func (x *StreamModulesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamModulesResponse.ProtoReflect.Descriptor instead. func (*StreamModulesResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{22} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{24} } func (x *StreamModulesResponse) GetModules() []*Module { @@ -1839,7 +2047,7 @@ type EventsQuery struct { func (x *EventsQuery) Reset() { *x = EventsQuery{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1851,7 +2059,7 @@ func (x *EventsQuery) String() string { func (*EventsQuery) ProtoMessage() {} func (x *EventsQuery) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[23] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1864,7 +2072,7 @@ func (x *EventsQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery.ProtoReflect.Descriptor instead. func (*EventsQuery) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25} } func (x *EventsQuery) GetFilters() []*EventsQuery_Filter { @@ -1899,7 +2107,7 @@ type StreamEventsRequest struct { func (x *StreamEventsRequest) Reset() { *x = StreamEventsRequest{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1911,7 +2119,7 @@ func (x *StreamEventsRequest) String() string { func (*StreamEventsRequest) ProtoMessage() {} func (x *StreamEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[24] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1924,7 +2132,7 @@ func (x *StreamEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamEventsRequest.ProtoReflect.Descriptor instead. func (*StreamEventsRequest) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{24} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{26} } func (x *StreamEventsRequest) GetUpdateInterval() *durationpb.Duration { @@ -1951,7 +2159,7 @@ type StreamEventsResponse struct { func (x *StreamEventsResponse) Reset() { *x = StreamEventsResponse{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1963,7 +2171,7 @@ func (x *StreamEventsResponse) String() string { func (*StreamEventsResponse) ProtoMessage() {} func (x *StreamEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[25] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1976,7 +2184,7 @@ func (x *StreamEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamEventsResponse.ProtoReflect.Descriptor instead. func (*StreamEventsResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{27} } func (x *StreamEventsResponse) GetEvents() []*Event { @@ -2003,12 +2211,14 @@ type Event struct { // *Event_Ingress // *Event_CronScheduled // *Event_AsyncExecute + // *Event_PubsubPublish + // *Event_PubsubConsume Entry isEvent_Entry `protobuf_oneof:"entry"` } func (x *Event) Reset() { *x = Event{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2020,7 +2230,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[26] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2033,7 +2243,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{26} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{28} } func (x *Event) GetTimeStamp() *timestamppb.Timestamp { @@ -2106,6 +2316,20 @@ func (x *Event) GetAsyncExecute() *AsyncExecuteEvent { return nil } +func (x *Event) GetPubsubPublish() *PubSubPublishEvent { + if x, ok := x.GetEntry().(*Event_PubsubPublish); ok { + return x.PubsubPublish + } + return nil +} + +func (x *Event) GetPubsubConsume() *PubSubConsumeEvent { + if x, ok := x.GetEntry().(*Event_PubsubConsume); ok { + return x.PubsubConsume + } + return nil +} + type isEvent_Entry interface { isEvent_Entry() } @@ -2138,6 +2362,14 @@ type Event_AsyncExecute struct { AsyncExecute *AsyncExecuteEvent `protobuf:"bytes,9,opt,name=async_execute,json=asyncExecute,proto3,oneof"` } +type Event_PubsubPublish struct { + PubsubPublish *PubSubPublishEvent `protobuf:"bytes,10,opt,name=pubsub_publish,json=pubsubPublish,proto3,oneof"` +} + +type Event_PubsubConsume struct { + PubsubConsume *PubSubConsumeEvent `protobuf:"bytes,11,opt,name=pubsub_consume,json=pubsubConsume,proto3,oneof"` +} + func (*Event_Log) isEvent_Entry() {} func (*Event_Call) isEvent_Entry() {} @@ -2152,6 +2384,10 @@ func (*Event_CronScheduled) isEvent_Entry() {} func (*Event_AsyncExecute) isEvent_Entry() {} +func (*Event_PubsubPublish) isEvent_Entry() {} + +func (*Event_PubsubConsume) isEvent_Entry() {} + type GetEventsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2164,7 +2400,7 @@ type GetEventsResponse struct { func (x *GetEventsResponse) Reset() { *x = GetEventsResponse{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[27] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2176,7 +2412,7 @@ func (x *GetEventsResponse) String() string { func (*GetEventsResponse) ProtoMessage() {} func (x *GetEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[27] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2189,7 +2425,7 @@ func (x *GetEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEventsResponse.ProtoReflect.Descriptor instead. func (*GetEventsResponse) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{27} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{29} } func (x *GetEventsResponse) GetEvents() []*Event { @@ -2217,7 +2453,7 @@ type EventsQuery_LimitFilter struct { func (x *EventsQuery_LimitFilter) Reset() { *x = EventsQuery_LimitFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[29] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2229,7 +2465,7 @@ func (x *EventsQuery_LimitFilter) String() string { func (*EventsQuery_LimitFilter) ProtoMessage() {} func (x *EventsQuery_LimitFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[29] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2242,7 +2478,7 @@ func (x *EventsQuery_LimitFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_LimitFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_LimitFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 0} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 0} } func (x *EventsQuery_LimitFilter) GetLimit() int32 { @@ -2263,7 +2499,7 @@ type EventsQuery_LogLevelFilter struct { func (x *EventsQuery_LogLevelFilter) Reset() { *x = EventsQuery_LogLevelFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[30] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2275,7 +2511,7 @@ func (x *EventsQuery_LogLevelFilter) String() string { func (*EventsQuery_LogLevelFilter) ProtoMessage() {} func (x *EventsQuery_LogLevelFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[30] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2288,7 +2524,7 @@ func (x *EventsQuery_LogLevelFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_LogLevelFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_LogLevelFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 1} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 1} } func (x *EventsQuery_LogLevelFilter) GetLogLevel() LogLevel { @@ -2309,7 +2545,7 @@ type EventsQuery_DeploymentFilter struct { func (x *EventsQuery_DeploymentFilter) Reset() { *x = EventsQuery_DeploymentFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2321,7 +2557,7 @@ func (x *EventsQuery_DeploymentFilter) String() string { func (*EventsQuery_DeploymentFilter) ProtoMessage() {} func (x *EventsQuery_DeploymentFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[31] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2334,7 +2570,7 @@ func (x *EventsQuery_DeploymentFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_DeploymentFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_DeploymentFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 2} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 2} } func (x *EventsQuery_DeploymentFilter) GetDeployments() []string { @@ -2355,7 +2591,7 @@ type EventsQuery_RequestFilter struct { func (x *EventsQuery_RequestFilter) Reset() { *x = EventsQuery_RequestFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2367,7 +2603,7 @@ func (x *EventsQuery_RequestFilter) String() string { func (*EventsQuery_RequestFilter) ProtoMessage() {} func (x *EventsQuery_RequestFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[32] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2380,7 +2616,7 @@ func (x *EventsQuery_RequestFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_RequestFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_RequestFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 3} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 3} } func (x *EventsQuery_RequestFilter) GetRequests() []string { @@ -2401,7 +2637,7 @@ type EventsQuery_EventTypeFilter struct { func (x *EventsQuery_EventTypeFilter) Reset() { *x = EventsQuery_EventTypeFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2413,7 +2649,7 @@ func (x *EventsQuery_EventTypeFilter) String() string { func (*EventsQuery_EventTypeFilter) ProtoMessage() {} func (x *EventsQuery_EventTypeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[33] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2426,7 +2662,7 @@ func (x *EventsQuery_EventTypeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_EventTypeFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_EventTypeFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 4} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 4} } func (x *EventsQuery_EventTypeFilter) GetEventTypes() []EventType { @@ -2450,7 +2686,7 @@ type EventsQuery_TimeFilter struct { func (x *EventsQuery_TimeFilter) Reset() { *x = EventsQuery_TimeFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2462,7 +2698,7 @@ func (x *EventsQuery_TimeFilter) String() string { func (*EventsQuery_TimeFilter) ProtoMessage() {} func (x *EventsQuery_TimeFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[34] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2475,7 +2711,7 @@ func (x *EventsQuery_TimeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_TimeFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_TimeFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 5} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 5} } func (x *EventsQuery_TimeFilter) GetOlderThan() *timestamppb.Timestamp { @@ -2506,7 +2742,7 @@ type EventsQuery_IDFilter struct { func (x *EventsQuery_IDFilter) Reset() { *x = EventsQuery_IDFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2518,7 +2754,7 @@ func (x *EventsQuery_IDFilter) String() string { func (*EventsQuery_IDFilter) ProtoMessage() {} func (x *EventsQuery_IDFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[35] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2531,7 +2767,7 @@ func (x *EventsQuery_IDFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_IDFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_IDFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 6} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 6} } func (x *EventsQuery_IDFilter) GetLowerThan() int64 { @@ -2561,7 +2797,7 @@ type EventsQuery_CallFilter struct { func (x *EventsQuery_CallFilter) Reset() { *x = EventsQuery_CallFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2573,7 +2809,7 @@ func (x *EventsQuery_CallFilter) String() string { func (*EventsQuery_CallFilter) ProtoMessage() {} func (x *EventsQuery_CallFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[36] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2586,7 +2822,7 @@ func (x *EventsQuery_CallFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_CallFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_CallFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 7} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 7} } func (x *EventsQuery_CallFilter) GetDestModule() string { @@ -2621,7 +2857,7 @@ type EventsQuery_ModuleFilter struct { func (x *EventsQuery_ModuleFilter) Reset() { *x = EventsQuery_ModuleFilter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2633,7 +2869,7 @@ func (x *EventsQuery_ModuleFilter) String() string { func (*EventsQuery_ModuleFilter) ProtoMessage() {} func (x *EventsQuery_ModuleFilter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[37] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2646,7 +2882,7 @@ func (x *EventsQuery_ModuleFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_ModuleFilter.ProtoReflect.Descriptor instead. func (*EventsQuery_ModuleFilter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 8} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 8} } func (x *EventsQuery_ModuleFilter) GetModule() string { @@ -2686,7 +2922,7 @@ type EventsQuery_Filter struct { func (x *EventsQuery_Filter) Reset() { *x = EventsQuery_Filter{} - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2698,7 +2934,7 @@ func (x *EventsQuery_Filter) String() string { func (*EventsQuery_Filter) ProtoMessage() {} func (x *EventsQuery_Filter) ProtoReflect() protoreflect.Message { - mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[38] + mi := &file_xyz_block_ftl_v1_console_console_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2711,7 +2947,7 @@ func (x *EventsQuery_Filter) ProtoReflect() protoreflect.Message { // Deprecated: Use EventsQuery_Filter.ProtoReflect.Descriptor instead. func (*EventsQuery_Filter) Descriptor() ([]byte, []int) { - return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{23, 9} + return file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP(), []int{25, 9} } func (m *EventsQuery_Filter) GetFilter() isEventsQuery_Filter_Filter { @@ -3019,398 +3255,462 @@ var file_xyz_block_ftl_v1_console_console_proto_rawDesc = []byte{ 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x31, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf1, 0x02, 0x0a, 0x12, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x62, + 0x5f, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, + 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x52, 0x65, + 0x66, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x35, 0x0a, 0x08, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa0, 0x03, 0x0a, 0x12, 0x50, 0x75, 0x62, + 0x53, 0x75, 0x62, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, + 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x56, 0x65, + 0x72, 0x62, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x64, + 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x62, 0x4e, + 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x19, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x64, 0x65, + 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7f, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, + 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, + 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x87, + 0x01, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x77, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, + 0x12, 0x31, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x04, 0x65, + 0x6e, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x22, 0x77, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x31, 0x0a, 0x04, 0x65, 0x6e, 0x75, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x0a, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x7b, 0x0a, 0x05, 0x54, 0x6f, - 0x70, 0x69, 0x63, 0x12, 0x34, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, + 0x73, 0x22, 0x7b, 0x0a, 0x05, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x34, 0x0a, 0x05, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x8b, + 0x01, 0x0a, 0x09, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x40, 0x0a, 0x09, + 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x3c, + 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, + 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x7f, 0x0a, 0x06, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, + 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x97, 0x01, + 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, + 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x09, 0x54, 0x79, 0x70, 0x65, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x09, 0x74, 0x79, - 0x70, 0x65, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x7f, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x37, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x22, 0xbf, 0x01, 0x0a, 0x04, 0x56, 0x65, 0x72, 0x62, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x65, 0x72, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3c, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x22, 0x9f, 0x05, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x34, 0x0a, 0x05, - 0x76, 0x65, 0x72, 0x62, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, - 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x05, 0x76, 0x65, 0x72, - 0x62, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x04, 0x56, 0x65, 0x72, 0x62, + 0x12, 0x31, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x04, 0x76, + 0x65, 0x72, 0x62, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x6a, + 0x73, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x3c, 0x0a, 0x0a, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x9f, 0x05, 0x0a, 0x06, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x56, 0x65, + 0x72, 0x62, 0x52, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, - 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x40, - 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, - 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, - 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x12, 0x37, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x6c, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3a, 0x0a, + 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, + 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, - 0x45, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x0c, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x12, 0x37, 0x0a, + 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x29, 0x0a, 0x0d, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, - 0x4b, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x06, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x13, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x4c, 0x0a, + 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x29, 0x0a, 0x0d, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x4b, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x12, 0x3f, 0x0a, 0x06, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3a, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x16, 0x0a, 0x14, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x53, 0x0a, 0x15, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, + 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe4, 0x0d, 0x0a, 0x0b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x53, 0x0a, 0x15, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x73, 0x22, 0xe4, 0x0d, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x46, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x41, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x41, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x1a, 0x23, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x51, + 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x3f, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x1a, 0x34, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x2b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x1a, 0x57, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x78, + 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0xaa, 0x01, + 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0a, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, + 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x09, + 0x6e, 0x65, 0x77, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x1a, 0x73, 0x0a, 0x08, 0x49, 0x44, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, + 0x74, 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x69, + 0x67, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x01, 0x52, 0x0a, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x1a, + 0x99, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, + 0x20, 0x0a, 0x09, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x62, 0x88, 0x01, + 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x1a, 0x48, 0x0a, 0x0c, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x76, 0x65, 0x72, 0x62, 0x1a, 0xdb, 0x05, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x53, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x1a, 0x23, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x51, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x78, - 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x34, 0x0a, 0x10, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x1a, 0x2b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x57, 0x0a, - 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x44, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x5a, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0xaa, 0x01, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x74, - 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x68, - 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x74, - 0x68, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x54, 0x68, - 0x61, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, - 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x74, - 0x68, 0x61, 0x6e, 0x1a, 0x73, 0x0a, 0x08, 0x49, 0x44, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, - 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, - 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, - 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x68, 0x69, 0x67, 0x68, - 0x65, 0x72, 0x54, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x69, 0x67, - 0x68, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x1a, 0x99, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x6c, - 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x5f, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, - 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x64, 0x65, 0x73, 0x74, - 0x5f, 0x76, 0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x64, - 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x62, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, - 0x72, 0x62, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x1a, 0x48, 0x0a, 0x0c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x04, - 0x76, 0x65, 0x72, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x76, 0x65, - 0x72, 0x62, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x1a, 0xdb, - 0x05, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x53, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5a, 0x0a, 0x0b, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x51, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, + 0x58, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, + 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x40, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, - 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x49, 0x44, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x04, - 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, - 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4c, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x49, 0x44, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x4c, 0x0a, 0x06, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x78, 0x79, + 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x1a, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x07, 0x0a, 0x03, + 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x22, + 0xaf, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x3b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x22, 0x4f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xb1, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x1a, 0x0a, 0x05, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x22, 0xaf, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x4f, 0x0a, 0x14, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x83, 0x05, 0x0a, 0x05, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, + 0x39, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x39, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x61, 0x0a, 0x12, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x63, - 0x61, 0x6c, 0x6c, 0x12, 0x61, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x61, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, - 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x69, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x79, 0x7a, - 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x55, 0x0a, - 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x0d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x79, + 0x65, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x61, 0x0a, + 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x78, 0x79, 0x7a, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x42, 0x0a, 0x07, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, + 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x72, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x0d, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x73, + 0x79, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, + 0x55, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x55, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, + 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, + 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, + 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x42, 0x07, 0x0a, + 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x74, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, - 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x22, 0x74, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x1b, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x2a, 0xe7, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x10, - 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, - 0x44, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x10, - 0x07, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x41, - 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, - 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, - 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x2a, 0xa5, 0x02, 0x0a, + 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, + 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, + 0x0a, 0x1d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, + 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, + 0x04, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, + 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, + 0x43, 0x55, 0x54, 0x45, 0x10, 0x07, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x50, 0x55, 0x42, 0x4c, + 0x49, 0x53, 0x48, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x55, + 0x4d, 0x45, 0x10, 0x09, 0x2a, 0x85, 0x01, 0x0a, 0x15, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, + 0x0a, 0x20, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, 0x08, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, - 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, - 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, - 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, - 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, - 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x0d, 0x12, - 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x11, 0x32, 0x8b, 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, - 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, - 0x90, 0x02, 0x01, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x5f, 0x43, 0x52, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x53, 0x59, 0x4e, 0x43, + 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x88, 0x01, 0x0a, + 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x4f, 0x47, + 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x54, 0x52, + 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, + 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x09, 0x12, 0x12, + 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, + 0x10, 0x0d, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x11, 0x32, 0x8b, 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x1d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x67, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0d, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2e, 0x2e, - 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, - 0x12, 0x6f, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x72, 0x0a, 0x0d, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, - 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, - 0x01, 0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, - 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, - 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x50, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, 0x35, 0x2f, 0x66, - 0x74, 0x6c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, 0x74, 0x6c, 0x2f, - 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x70, 0x62, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, + 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x30, 0x01, 0x12, 0x5f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x25, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x2b, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x66, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x50, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x42, 0x44, 0x35, 0x34, 0x35, 0x36, 0x36, 0x39, 0x37, + 0x35, 0x2f, 0x66, 0x74, 0x6c, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x78, 0x79, 0x7a, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2f, 0x66, + 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3b, 0x70, 0x62, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3426,7 +3726,7 @@ func file_xyz_block_ftl_v1_console_console_proto_rawDescGZIP() []byte { } var file_xyz_block_ftl_v1_console_console_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_xyz_block_ftl_v1_console_console_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_xyz_block_ftl_v1_console_console_proto_goTypes = []any{ (EventType)(0), // 0: xyz.block.ftl.v1.console.EventType (AsyncExecuteEventType)(0), // 1: xyz.block.ftl.v1.console.AsyncExecuteEventType @@ -3439,144 +3739,153 @@ var file_xyz_block_ftl_v1_console_console_proto_goTypes = []any{ (*IngressEvent)(nil), // 8: xyz.block.ftl.v1.console.IngressEvent (*CronScheduledEvent)(nil), // 9: xyz.block.ftl.v1.console.CronScheduledEvent (*AsyncExecuteEvent)(nil), // 10: xyz.block.ftl.v1.console.AsyncExecuteEvent - (*Config)(nil), // 11: xyz.block.ftl.v1.console.Config - (*Data)(nil), // 12: xyz.block.ftl.v1.console.Data - (*Database)(nil), // 13: xyz.block.ftl.v1.console.Database - (*Enum)(nil), // 14: xyz.block.ftl.v1.console.Enum - (*Topic)(nil), // 15: xyz.block.ftl.v1.console.Topic - (*TypeAlias)(nil), // 16: xyz.block.ftl.v1.console.TypeAlias - (*Secret)(nil), // 17: xyz.block.ftl.v1.console.Secret - (*Subscription)(nil), // 18: xyz.block.ftl.v1.console.Subscription - (*Verb)(nil), // 19: xyz.block.ftl.v1.console.Verb - (*Module)(nil), // 20: xyz.block.ftl.v1.console.Module - (*TopologyGroup)(nil), // 21: xyz.block.ftl.v1.console.TopologyGroup - (*Topology)(nil), // 22: xyz.block.ftl.v1.console.Topology - (*GetModulesRequest)(nil), // 23: xyz.block.ftl.v1.console.GetModulesRequest - (*GetModulesResponse)(nil), // 24: xyz.block.ftl.v1.console.GetModulesResponse - (*StreamModulesRequest)(nil), // 25: xyz.block.ftl.v1.console.StreamModulesRequest - (*StreamModulesResponse)(nil), // 26: xyz.block.ftl.v1.console.StreamModulesResponse - (*EventsQuery)(nil), // 27: xyz.block.ftl.v1.console.EventsQuery - (*StreamEventsRequest)(nil), // 28: xyz.block.ftl.v1.console.StreamEventsRequest - (*StreamEventsResponse)(nil), // 29: xyz.block.ftl.v1.console.StreamEventsResponse - (*Event)(nil), // 30: xyz.block.ftl.v1.console.Event - (*GetEventsResponse)(nil), // 31: xyz.block.ftl.v1.console.GetEventsResponse - nil, // 32: xyz.block.ftl.v1.console.LogEvent.AttributesEntry - (*EventsQuery_LimitFilter)(nil), // 33: xyz.block.ftl.v1.console.EventsQuery.LimitFilter - (*EventsQuery_LogLevelFilter)(nil), // 34: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter - (*EventsQuery_DeploymentFilter)(nil), // 35: xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter - (*EventsQuery_RequestFilter)(nil), // 36: xyz.block.ftl.v1.console.EventsQuery.RequestFilter - (*EventsQuery_EventTypeFilter)(nil), // 37: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter - (*EventsQuery_TimeFilter)(nil), // 38: xyz.block.ftl.v1.console.EventsQuery.TimeFilter - (*EventsQuery_IDFilter)(nil), // 39: xyz.block.ftl.v1.console.EventsQuery.IDFilter - (*EventsQuery_CallFilter)(nil), // 40: xyz.block.ftl.v1.console.EventsQuery.CallFilter - (*EventsQuery_ModuleFilter)(nil), // 41: xyz.block.ftl.v1.console.EventsQuery.ModuleFilter - (*EventsQuery_Filter)(nil), // 42: xyz.block.ftl.v1.console.EventsQuery.Filter - (*timestamppb.Timestamp)(nil), // 43: google.protobuf.Timestamp - (*schema.Ref)(nil), // 44: xyz.block.ftl.v1.schema.Ref - (*durationpb.Duration)(nil), // 45: google.protobuf.Duration - (*schema.Config)(nil), // 46: xyz.block.ftl.v1.schema.Config - (*schema.Data)(nil), // 47: xyz.block.ftl.v1.schema.Data - (*schema.Database)(nil), // 48: xyz.block.ftl.v1.schema.Database - (*schema.Enum)(nil), // 49: xyz.block.ftl.v1.schema.Enum - (*schema.Topic)(nil), // 50: xyz.block.ftl.v1.schema.Topic - (*schema.TypeAlias)(nil), // 51: xyz.block.ftl.v1.schema.TypeAlias - (*schema.Secret)(nil), // 52: xyz.block.ftl.v1.schema.Secret - (*schema.Subscription)(nil), // 53: xyz.block.ftl.v1.schema.Subscription - (*schema.Verb)(nil), // 54: xyz.block.ftl.v1.schema.Verb - (*v1.PingRequest)(nil), // 55: xyz.block.ftl.v1.PingRequest - (*v1.PingResponse)(nil), // 56: xyz.block.ftl.v1.PingResponse + (*PubSubPublishEvent)(nil), // 11: xyz.block.ftl.v1.console.PubSubPublishEvent + (*PubSubConsumeEvent)(nil), // 12: xyz.block.ftl.v1.console.PubSubConsumeEvent + (*Config)(nil), // 13: xyz.block.ftl.v1.console.Config + (*Data)(nil), // 14: xyz.block.ftl.v1.console.Data + (*Database)(nil), // 15: xyz.block.ftl.v1.console.Database + (*Enum)(nil), // 16: xyz.block.ftl.v1.console.Enum + (*Topic)(nil), // 17: xyz.block.ftl.v1.console.Topic + (*TypeAlias)(nil), // 18: xyz.block.ftl.v1.console.TypeAlias + (*Secret)(nil), // 19: xyz.block.ftl.v1.console.Secret + (*Subscription)(nil), // 20: xyz.block.ftl.v1.console.Subscription + (*Verb)(nil), // 21: xyz.block.ftl.v1.console.Verb + (*Module)(nil), // 22: xyz.block.ftl.v1.console.Module + (*TopologyGroup)(nil), // 23: xyz.block.ftl.v1.console.TopologyGroup + (*Topology)(nil), // 24: xyz.block.ftl.v1.console.Topology + (*GetModulesRequest)(nil), // 25: xyz.block.ftl.v1.console.GetModulesRequest + (*GetModulesResponse)(nil), // 26: xyz.block.ftl.v1.console.GetModulesResponse + (*StreamModulesRequest)(nil), // 27: xyz.block.ftl.v1.console.StreamModulesRequest + (*StreamModulesResponse)(nil), // 28: xyz.block.ftl.v1.console.StreamModulesResponse + (*EventsQuery)(nil), // 29: xyz.block.ftl.v1.console.EventsQuery + (*StreamEventsRequest)(nil), // 30: xyz.block.ftl.v1.console.StreamEventsRequest + (*StreamEventsResponse)(nil), // 31: xyz.block.ftl.v1.console.StreamEventsResponse + (*Event)(nil), // 32: xyz.block.ftl.v1.console.Event + (*GetEventsResponse)(nil), // 33: xyz.block.ftl.v1.console.GetEventsResponse + nil, // 34: xyz.block.ftl.v1.console.LogEvent.AttributesEntry + (*EventsQuery_LimitFilter)(nil), // 35: xyz.block.ftl.v1.console.EventsQuery.LimitFilter + (*EventsQuery_LogLevelFilter)(nil), // 36: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter + (*EventsQuery_DeploymentFilter)(nil), // 37: xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter + (*EventsQuery_RequestFilter)(nil), // 38: xyz.block.ftl.v1.console.EventsQuery.RequestFilter + (*EventsQuery_EventTypeFilter)(nil), // 39: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter + (*EventsQuery_TimeFilter)(nil), // 40: xyz.block.ftl.v1.console.EventsQuery.TimeFilter + (*EventsQuery_IDFilter)(nil), // 41: xyz.block.ftl.v1.console.EventsQuery.IDFilter + (*EventsQuery_CallFilter)(nil), // 42: xyz.block.ftl.v1.console.EventsQuery.CallFilter + (*EventsQuery_ModuleFilter)(nil), // 43: xyz.block.ftl.v1.console.EventsQuery.ModuleFilter + (*EventsQuery_Filter)(nil), // 44: xyz.block.ftl.v1.console.EventsQuery.Filter + (*timestamppb.Timestamp)(nil), // 45: google.protobuf.Timestamp + (*schema.Ref)(nil), // 46: xyz.block.ftl.v1.schema.Ref + (*durationpb.Duration)(nil), // 47: google.protobuf.Duration + (*schema.Config)(nil), // 48: xyz.block.ftl.v1.schema.Config + (*schema.Data)(nil), // 49: xyz.block.ftl.v1.schema.Data + (*schema.Database)(nil), // 50: xyz.block.ftl.v1.schema.Database + (*schema.Enum)(nil), // 51: xyz.block.ftl.v1.schema.Enum + (*schema.Topic)(nil), // 52: xyz.block.ftl.v1.schema.Topic + (*schema.TypeAlias)(nil), // 53: xyz.block.ftl.v1.schema.TypeAlias + (*schema.Secret)(nil), // 54: xyz.block.ftl.v1.schema.Secret + (*schema.Subscription)(nil), // 55: xyz.block.ftl.v1.schema.Subscription + (*schema.Verb)(nil), // 56: xyz.block.ftl.v1.schema.Verb + (*v1.PingRequest)(nil), // 57: xyz.block.ftl.v1.PingRequest + (*v1.PingResponse)(nil), // 58: xyz.block.ftl.v1.PingResponse } var file_xyz_block_ftl_v1_console_console_proto_depIdxs = []int32{ - 43, // 0: xyz.block.ftl.v1.console.LogEvent.time_stamp:type_name -> google.protobuf.Timestamp - 32, // 1: xyz.block.ftl.v1.console.LogEvent.attributes:type_name -> xyz.block.ftl.v1.console.LogEvent.AttributesEntry - 43, // 2: xyz.block.ftl.v1.console.CallEvent.time_stamp:type_name -> google.protobuf.Timestamp - 44, // 3: xyz.block.ftl.v1.console.CallEvent.source_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 44, // 4: xyz.block.ftl.v1.console.CallEvent.destination_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 45, // 5: xyz.block.ftl.v1.console.CallEvent.duration:type_name -> google.protobuf.Duration - 44, // 6: xyz.block.ftl.v1.console.IngressEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 43, // 7: xyz.block.ftl.v1.console.IngressEvent.time_stamp:type_name -> google.protobuf.Timestamp - 45, // 8: xyz.block.ftl.v1.console.IngressEvent.duration:type_name -> google.protobuf.Duration - 44, // 9: xyz.block.ftl.v1.console.CronScheduledEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 43, // 10: xyz.block.ftl.v1.console.CronScheduledEvent.time_stamp:type_name -> google.protobuf.Timestamp - 45, // 11: xyz.block.ftl.v1.console.CronScheduledEvent.duration:type_name -> google.protobuf.Duration - 43, // 12: xyz.block.ftl.v1.console.CronScheduledEvent.scheduled_at:type_name -> google.protobuf.Timestamp - 44, // 13: xyz.block.ftl.v1.console.AsyncExecuteEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref - 43, // 14: xyz.block.ftl.v1.console.AsyncExecuteEvent.time_stamp:type_name -> google.protobuf.Timestamp - 45, // 15: xyz.block.ftl.v1.console.AsyncExecuteEvent.duration:type_name -> google.protobuf.Duration + 45, // 0: xyz.block.ftl.v1.console.LogEvent.time_stamp:type_name -> google.protobuf.Timestamp + 34, // 1: xyz.block.ftl.v1.console.LogEvent.attributes:type_name -> xyz.block.ftl.v1.console.LogEvent.AttributesEntry + 45, // 2: xyz.block.ftl.v1.console.CallEvent.time_stamp:type_name -> google.protobuf.Timestamp + 46, // 3: xyz.block.ftl.v1.console.CallEvent.source_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 46, // 4: xyz.block.ftl.v1.console.CallEvent.destination_verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 47, // 5: xyz.block.ftl.v1.console.CallEvent.duration:type_name -> google.protobuf.Duration + 46, // 6: xyz.block.ftl.v1.console.IngressEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 45, // 7: xyz.block.ftl.v1.console.IngressEvent.time_stamp:type_name -> google.protobuf.Timestamp + 47, // 8: xyz.block.ftl.v1.console.IngressEvent.duration:type_name -> google.protobuf.Duration + 46, // 9: xyz.block.ftl.v1.console.CronScheduledEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 45, // 10: xyz.block.ftl.v1.console.CronScheduledEvent.time_stamp:type_name -> google.protobuf.Timestamp + 47, // 11: xyz.block.ftl.v1.console.CronScheduledEvent.duration:type_name -> google.protobuf.Duration + 45, // 12: xyz.block.ftl.v1.console.CronScheduledEvent.scheduled_at:type_name -> google.protobuf.Timestamp + 46, // 13: xyz.block.ftl.v1.console.AsyncExecuteEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 45, // 14: xyz.block.ftl.v1.console.AsyncExecuteEvent.time_stamp:type_name -> google.protobuf.Timestamp + 47, // 15: xyz.block.ftl.v1.console.AsyncExecuteEvent.duration:type_name -> google.protobuf.Duration 1, // 16: xyz.block.ftl.v1.console.AsyncExecuteEvent.async_event_type:type_name -> xyz.block.ftl.v1.console.AsyncExecuteEventType - 46, // 17: xyz.block.ftl.v1.console.Config.config:type_name -> xyz.block.ftl.v1.schema.Config - 44, // 18: xyz.block.ftl.v1.console.Config.references:type_name -> xyz.block.ftl.v1.schema.Ref - 47, // 19: xyz.block.ftl.v1.console.Data.data:type_name -> xyz.block.ftl.v1.schema.Data - 44, // 20: xyz.block.ftl.v1.console.Data.references:type_name -> xyz.block.ftl.v1.schema.Ref - 48, // 21: xyz.block.ftl.v1.console.Database.database:type_name -> xyz.block.ftl.v1.schema.Database - 44, // 22: xyz.block.ftl.v1.console.Database.references:type_name -> xyz.block.ftl.v1.schema.Ref - 49, // 23: xyz.block.ftl.v1.console.Enum.enum:type_name -> xyz.block.ftl.v1.schema.Enum - 44, // 24: xyz.block.ftl.v1.console.Enum.references:type_name -> xyz.block.ftl.v1.schema.Ref - 50, // 25: xyz.block.ftl.v1.console.Topic.topic:type_name -> xyz.block.ftl.v1.schema.Topic - 44, // 26: xyz.block.ftl.v1.console.Topic.references:type_name -> xyz.block.ftl.v1.schema.Ref - 51, // 27: xyz.block.ftl.v1.console.TypeAlias.typealias:type_name -> xyz.block.ftl.v1.schema.TypeAlias - 44, // 28: xyz.block.ftl.v1.console.TypeAlias.references:type_name -> xyz.block.ftl.v1.schema.Ref - 52, // 29: xyz.block.ftl.v1.console.Secret.secret:type_name -> xyz.block.ftl.v1.schema.Secret - 44, // 30: xyz.block.ftl.v1.console.Secret.references:type_name -> xyz.block.ftl.v1.schema.Ref - 53, // 31: xyz.block.ftl.v1.console.Subscription.subscription:type_name -> xyz.block.ftl.v1.schema.Subscription - 44, // 32: xyz.block.ftl.v1.console.Subscription.references:type_name -> xyz.block.ftl.v1.schema.Ref - 54, // 33: xyz.block.ftl.v1.console.Verb.verb:type_name -> xyz.block.ftl.v1.schema.Verb - 44, // 34: xyz.block.ftl.v1.console.Verb.references:type_name -> xyz.block.ftl.v1.schema.Ref - 19, // 35: xyz.block.ftl.v1.console.Module.verbs:type_name -> xyz.block.ftl.v1.console.Verb - 12, // 36: xyz.block.ftl.v1.console.Module.data:type_name -> xyz.block.ftl.v1.console.Data - 17, // 37: xyz.block.ftl.v1.console.Module.secrets:type_name -> xyz.block.ftl.v1.console.Secret - 11, // 38: xyz.block.ftl.v1.console.Module.configs:type_name -> xyz.block.ftl.v1.console.Config - 13, // 39: xyz.block.ftl.v1.console.Module.databases:type_name -> xyz.block.ftl.v1.console.Database - 14, // 40: xyz.block.ftl.v1.console.Module.enums:type_name -> xyz.block.ftl.v1.console.Enum - 15, // 41: xyz.block.ftl.v1.console.Module.topics:type_name -> xyz.block.ftl.v1.console.Topic - 16, // 42: xyz.block.ftl.v1.console.Module.typealiases:type_name -> xyz.block.ftl.v1.console.TypeAlias - 18, // 43: xyz.block.ftl.v1.console.Module.subscriptions:type_name -> xyz.block.ftl.v1.console.Subscription - 21, // 44: xyz.block.ftl.v1.console.Topology.levels:type_name -> xyz.block.ftl.v1.console.TopologyGroup - 20, // 45: xyz.block.ftl.v1.console.GetModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module - 22, // 46: xyz.block.ftl.v1.console.GetModulesResponse.topology:type_name -> xyz.block.ftl.v1.console.Topology - 20, // 47: xyz.block.ftl.v1.console.StreamModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module - 42, // 48: xyz.block.ftl.v1.console.EventsQuery.filters:type_name -> xyz.block.ftl.v1.console.EventsQuery.Filter - 3, // 49: xyz.block.ftl.v1.console.EventsQuery.order:type_name -> xyz.block.ftl.v1.console.EventsQuery.Order - 45, // 50: xyz.block.ftl.v1.console.StreamEventsRequest.update_interval:type_name -> google.protobuf.Duration - 27, // 51: xyz.block.ftl.v1.console.StreamEventsRequest.query:type_name -> xyz.block.ftl.v1.console.EventsQuery - 30, // 52: xyz.block.ftl.v1.console.StreamEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event - 43, // 53: xyz.block.ftl.v1.console.Event.time_stamp:type_name -> google.protobuf.Timestamp - 4, // 54: xyz.block.ftl.v1.console.Event.log:type_name -> xyz.block.ftl.v1.console.LogEvent - 5, // 55: xyz.block.ftl.v1.console.Event.call:type_name -> xyz.block.ftl.v1.console.CallEvent - 6, // 56: xyz.block.ftl.v1.console.Event.deployment_created:type_name -> xyz.block.ftl.v1.console.DeploymentCreatedEvent - 7, // 57: xyz.block.ftl.v1.console.Event.deployment_updated:type_name -> xyz.block.ftl.v1.console.DeploymentUpdatedEvent - 8, // 58: xyz.block.ftl.v1.console.Event.ingress:type_name -> xyz.block.ftl.v1.console.IngressEvent - 9, // 59: xyz.block.ftl.v1.console.Event.cron_scheduled:type_name -> xyz.block.ftl.v1.console.CronScheduledEvent - 10, // 60: xyz.block.ftl.v1.console.Event.async_execute:type_name -> xyz.block.ftl.v1.console.AsyncExecuteEvent - 30, // 61: xyz.block.ftl.v1.console.GetEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event - 2, // 62: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter.log_level:type_name -> xyz.block.ftl.v1.console.LogLevel - 0, // 63: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter.event_types:type_name -> xyz.block.ftl.v1.console.EventType - 43, // 64: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp - 43, // 65: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp - 33, // 66: xyz.block.ftl.v1.console.EventsQuery.Filter.limit:type_name -> xyz.block.ftl.v1.console.EventsQuery.LimitFilter - 34, // 67: xyz.block.ftl.v1.console.EventsQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter - 35, // 68: xyz.block.ftl.v1.console.EventsQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter - 36, // 69: xyz.block.ftl.v1.console.EventsQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.EventsQuery.RequestFilter - 37, // 70: xyz.block.ftl.v1.console.EventsQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter - 38, // 71: xyz.block.ftl.v1.console.EventsQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.EventsQuery.TimeFilter - 39, // 72: xyz.block.ftl.v1.console.EventsQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.EventsQuery.IDFilter - 40, // 73: xyz.block.ftl.v1.console.EventsQuery.Filter.call:type_name -> xyz.block.ftl.v1.console.EventsQuery.CallFilter - 41, // 74: xyz.block.ftl.v1.console.EventsQuery.Filter.module:type_name -> xyz.block.ftl.v1.console.EventsQuery.ModuleFilter - 55, // 75: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest - 23, // 76: xyz.block.ftl.v1.console.ConsoleService.GetModules:input_type -> xyz.block.ftl.v1.console.GetModulesRequest - 25, // 77: xyz.block.ftl.v1.console.ConsoleService.StreamModules:input_type -> xyz.block.ftl.v1.console.StreamModulesRequest - 28, // 78: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:input_type -> xyz.block.ftl.v1.console.StreamEventsRequest - 27, // 79: xyz.block.ftl.v1.console.ConsoleService.GetEvents:input_type -> xyz.block.ftl.v1.console.EventsQuery - 56, // 80: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse - 24, // 81: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse - 26, // 82: xyz.block.ftl.v1.console.ConsoleService.StreamModules:output_type -> xyz.block.ftl.v1.console.StreamModulesResponse - 29, // 83: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:output_type -> xyz.block.ftl.v1.console.StreamEventsResponse - 31, // 84: xyz.block.ftl.v1.console.ConsoleService.GetEvents:output_type -> xyz.block.ftl.v1.console.GetEventsResponse - 80, // [80:85] is the sub-list for method output_type - 75, // [75:80] is the sub-list for method input_type - 75, // [75:75] is the sub-list for extension type_name - 75, // [75:75] is the sub-list for extension extendee - 0, // [0:75] is the sub-list for field type_name + 46, // 17: xyz.block.ftl.v1.console.PubSubPublishEvent.verb_ref:type_name -> xyz.block.ftl.v1.schema.Ref + 45, // 18: xyz.block.ftl.v1.console.PubSubPublishEvent.time_stamp:type_name -> google.protobuf.Timestamp + 47, // 19: xyz.block.ftl.v1.console.PubSubPublishEvent.duration:type_name -> google.protobuf.Duration + 45, // 20: xyz.block.ftl.v1.console.PubSubConsumeEvent.time_stamp:type_name -> google.protobuf.Timestamp + 47, // 21: xyz.block.ftl.v1.console.PubSubConsumeEvent.duration:type_name -> google.protobuf.Duration + 48, // 22: xyz.block.ftl.v1.console.Config.config:type_name -> xyz.block.ftl.v1.schema.Config + 46, // 23: xyz.block.ftl.v1.console.Config.references:type_name -> xyz.block.ftl.v1.schema.Ref + 49, // 24: xyz.block.ftl.v1.console.Data.data:type_name -> xyz.block.ftl.v1.schema.Data + 46, // 25: xyz.block.ftl.v1.console.Data.references:type_name -> xyz.block.ftl.v1.schema.Ref + 50, // 26: xyz.block.ftl.v1.console.Database.database:type_name -> xyz.block.ftl.v1.schema.Database + 46, // 27: xyz.block.ftl.v1.console.Database.references:type_name -> xyz.block.ftl.v1.schema.Ref + 51, // 28: xyz.block.ftl.v1.console.Enum.enum:type_name -> xyz.block.ftl.v1.schema.Enum + 46, // 29: xyz.block.ftl.v1.console.Enum.references:type_name -> xyz.block.ftl.v1.schema.Ref + 52, // 30: xyz.block.ftl.v1.console.Topic.topic:type_name -> xyz.block.ftl.v1.schema.Topic + 46, // 31: xyz.block.ftl.v1.console.Topic.references:type_name -> xyz.block.ftl.v1.schema.Ref + 53, // 32: xyz.block.ftl.v1.console.TypeAlias.typealias:type_name -> xyz.block.ftl.v1.schema.TypeAlias + 46, // 33: xyz.block.ftl.v1.console.TypeAlias.references:type_name -> xyz.block.ftl.v1.schema.Ref + 54, // 34: xyz.block.ftl.v1.console.Secret.secret:type_name -> xyz.block.ftl.v1.schema.Secret + 46, // 35: xyz.block.ftl.v1.console.Secret.references:type_name -> xyz.block.ftl.v1.schema.Ref + 55, // 36: xyz.block.ftl.v1.console.Subscription.subscription:type_name -> xyz.block.ftl.v1.schema.Subscription + 46, // 37: xyz.block.ftl.v1.console.Subscription.references:type_name -> xyz.block.ftl.v1.schema.Ref + 56, // 38: xyz.block.ftl.v1.console.Verb.verb:type_name -> xyz.block.ftl.v1.schema.Verb + 46, // 39: xyz.block.ftl.v1.console.Verb.references:type_name -> xyz.block.ftl.v1.schema.Ref + 21, // 40: xyz.block.ftl.v1.console.Module.verbs:type_name -> xyz.block.ftl.v1.console.Verb + 14, // 41: xyz.block.ftl.v1.console.Module.data:type_name -> xyz.block.ftl.v1.console.Data + 19, // 42: xyz.block.ftl.v1.console.Module.secrets:type_name -> xyz.block.ftl.v1.console.Secret + 13, // 43: xyz.block.ftl.v1.console.Module.configs:type_name -> xyz.block.ftl.v1.console.Config + 15, // 44: xyz.block.ftl.v1.console.Module.databases:type_name -> xyz.block.ftl.v1.console.Database + 16, // 45: xyz.block.ftl.v1.console.Module.enums:type_name -> xyz.block.ftl.v1.console.Enum + 17, // 46: xyz.block.ftl.v1.console.Module.topics:type_name -> xyz.block.ftl.v1.console.Topic + 18, // 47: xyz.block.ftl.v1.console.Module.typealiases:type_name -> xyz.block.ftl.v1.console.TypeAlias + 20, // 48: xyz.block.ftl.v1.console.Module.subscriptions:type_name -> xyz.block.ftl.v1.console.Subscription + 23, // 49: xyz.block.ftl.v1.console.Topology.levels:type_name -> xyz.block.ftl.v1.console.TopologyGroup + 22, // 50: xyz.block.ftl.v1.console.GetModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module + 24, // 51: xyz.block.ftl.v1.console.GetModulesResponse.topology:type_name -> xyz.block.ftl.v1.console.Topology + 22, // 52: xyz.block.ftl.v1.console.StreamModulesResponse.modules:type_name -> xyz.block.ftl.v1.console.Module + 44, // 53: xyz.block.ftl.v1.console.EventsQuery.filters:type_name -> xyz.block.ftl.v1.console.EventsQuery.Filter + 3, // 54: xyz.block.ftl.v1.console.EventsQuery.order:type_name -> xyz.block.ftl.v1.console.EventsQuery.Order + 47, // 55: xyz.block.ftl.v1.console.StreamEventsRequest.update_interval:type_name -> google.protobuf.Duration + 29, // 56: xyz.block.ftl.v1.console.StreamEventsRequest.query:type_name -> xyz.block.ftl.v1.console.EventsQuery + 32, // 57: xyz.block.ftl.v1.console.StreamEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event + 45, // 58: xyz.block.ftl.v1.console.Event.time_stamp:type_name -> google.protobuf.Timestamp + 4, // 59: xyz.block.ftl.v1.console.Event.log:type_name -> xyz.block.ftl.v1.console.LogEvent + 5, // 60: xyz.block.ftl.v1.console.Event.call:type_name -> xyz.block.ftl.v1.console.CallEvent + 6, // 61: xyz.block.ftl.v1.console.Event.deployment_created:type_name -> xyz.block.ftl.v1.console.DeploymentCreatedEvent + 7, // 62: xyz.block.ftl.v1.console.Event.deployment_updated:type_name -> xyz.block.ftl.v1.console.DeploymentUpdatedEvent + 8, // 63: xyz.block.ftl.v1.console.Event.ingress:type_name -> xyz.block.ftl.v1.console.IngressEvent + 9, // 64: xyz.block.ftl.v1.console.Event.cron_scheduled:type_name -> xyz.block.ftl.v1.console.CronScheduledEvent + 10, // 65: xyz.block.ftl.v1.console.Event.async_execute:type_name -> xyz.block.ftl.v1.console.AsyncExecuteEvent + 11, // 66: xyz.block.ftl.v1.console.Event.pubsub_publish:type_name -> xyz.block.ftl.v1.console.PubSubPublishEvent + 12, // 67: xyz.block.ftl.v1.console.Event.pubsub_consume:type_name -> xyz.block.ftl.v1.console.PubSubConsumeEvent + 32, // 68: xyz.block.ftl.v1.console.GetEventsResponse.events:type_name -> xyz.block.ftl.v1.console.Event + 2, // 69: xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter.log_level:type_name -> xyz.block.ftl.v1.console.LogLevel + 0, // 70: xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter.event_types:type_name -> xyz.block.ftl.v1.console.EventType + 45, // 71: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.older_than:type_name -> google.protobuf.Timestamp + 45, // 72: xyz.block.ftl.v1.console.EventsQuery.TimeFilter.newer_than:type_name -> google.protobuf.Timestamp + 35, // 73: xyz.block.ftl.v1.console.EventsQuery.Filter.limit:type_name -> xyz.block.ftl.v1.console.EventsQuery.LimitFilter + 36, // 74: xyz.block.ftl.v1.console.EventsQuery.Filter.log_level:type_name -> xyz.block.ftl.v1.console.EventsQuery.LogLevelFilter + 37, // 75: xyz.block.ftl.v1.console.EventsQuery.Filter.deployments:type_name -> xyz.block.ftl.v1.console.EventsQuery.DeploymentFilter + 38, // 76: xyz.block.ftl.v1.console.EventsQuery.Filter.requests:type_name -> xyz.block.ftl.v1.console.EventsQuery.RequestFilter + 39, // 77: xyz.block.ftl.v1.console.EventsQuery.Filter.event_types:type_name -> xyz.block.ftl.v1.console.EventsQuery.EventTypeFilter + 40, // 78: xyz.block.ftl.v1.console.EventsQuery.Filter.time:type_name -> xyz.block.ftl.v1.console.EventsQuery.TimeFilter + 41, // 79: xyz.block.ftl.v1.console.EventsQuery.Filter.id:type_name -> xyz.block.ftl.v1.console.EventsQuery.IDFilter + 42, // 80: xyz.block.ftl.v1.console.EventsQuery.Filter.call:type_name -> xyz.block.ftl.v1.console.EventsQuery.CallFilter + 43, // 81: xyz.block.ftl.v1.console.EventsQuery.Filter.module:type_name -> xyz.block.ftl.v1.console.EventsQuery.ModuleFilter + 57, // 82: xyz.block.ftl.v1.console.ConsoleService.Ping:input_type -> xyz.block.ftl.v1.PingRequest + 25, // 83: xyz.block.ftl.v1.console.ConsoleService.GetModules:input_type -> xyz.block.ftl.v1.console.GetModulesRequest + 27, // 84: xyz.block.ftl.v1.console.ConsoleService.StreamModules:input_type -> xyz.block.ftl.v1.console.StreamModulesRequest + 30, // 85: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:input_type -> xyz.block.ftl.v1.console.StreamEventsRequest + 29, // 86: xyz.block.ftl.v1.console.ConsoleService.GetEvents:input_type -> xyz.block.ftl.v1.console.EventsQuery + 58, // 87: xyz.block.ftl.v1.console.ConsoleService.Ping:output_type -> xyz.block.ftl.v1.PingResponse + 26, // 88: xyz.block.ftl.v1.console.ConsoleService.GetModules:output_type -> xyz.block.ftl.v1.console.GetModulesResponse + 28, // 89: xyz.block.ftl.v1.console.ConsoleService.StreamModules:output_type -> xyz.block.ftl.v1.console.StreamModulesResponse + 31, // 90: xyz.block.ftl.v1.console.ConsoleService.StreamEvents:output_type -> xyz.block.ftl.v1.console.StreamEventsResponse + 33, // 91: xyz.block.ftl.v1.console.ConsoleService.GetEvents:output_type -> xyz.block.ftl.v1.console.GetEventsResponse + 87, // [87:92] is the sub-list for method output_type + 82, // [82:87] is the sub-list for method input_type + 82, // [82:82] is the sub-list for extension type_name + 82, // [82:82] is the sub-list for extension extendee + 0, // [0:82] is the sub-list for field type_name } func init() { file_xyz_block_ftl_v1_console_console_proto_init() } @@ -3590,8 +3899,10 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { file_xyz_block_ftl_v1_console_console_proto_msgTypes[4].OneofWrappers = []any{} file_xyz_block_ftl_v1_console_console_proto_msgTypes[5].OneofWrappers = []any{} file_xyz_block_ftl_v1_console_console_proto_msgTypes[6].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[24].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[26].OneofWrappers = []any{ + file_xyz_block_ftl_v1_console_console_proto_msgTypes[7].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[8].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[26].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[28].OneofWrappers = []any{ (*Event_Log)(nil), (*Event_Call)(nil), (*Event_DeploymentCreated)(nil), @@ -3599,13 +3910,15 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { (*Event_Ingress)(nil), (*Event_CronScheduled)(nil), (*Event_AsyncExecute)(nil), + (*Event_PubsubPublish)(nil), + (*Event_PubsubConsume)(nil), } - file_xyz_block_ftl_v1_console_console_proto_msgTypes[27].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[34].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[35].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[29].OneofWrappers = []any{} file_xyz_block_ftl_v1_console_console_proto_msgTypes[36].OneofWrappers = []any{} file_xyz_block_ftl_v1_console_console_proto_msgTypes[37].OneofWrappers = []any{} - file_xyz_block_ftl_v1_console_console_proto_msgTypes[38].OneofWrappers = []any{ + file_xyz_block_ftl_v1_console_console_proto_msgTypes[38].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[39].OneofWrappers = []any{} + file_xyz_block_ftl_v1_console_console_proto_msgTypes[40].OneofWrappers = []any{ (*EventsQuery_Filter_Limit)(nil), (*EventsQuery_Filter_LogLevel)(nil), (*EventsQuery_Filter_Deployments)(nil), @@ -3622,7 +3935,7 @@ func file_xyz_block_ftl_v1_console_console_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_xyz_block_ftl_v1_console_console_proto_rawDesc, NumEnums: 4, - NumMessages: 39, + NumMessages: 41, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/protos/xyz/block/ftl/v1/console/console.proto b/backend/protos/xyz/block/ftl/v1/console/console.proto index 4212d3b0df..4886dbaff5 100644 --- a/backend/protos/xyz/block/ftl/v1/console/console.proto +++ b/backend/protos/xyz/block/ftl/v1/console/console.proto @@ -19,6 +19,8 @@ enum EventType { EVENT_TYPE_INGRESS = 5; EVENT_TYPE_CRON_SCHEDULED = 6; EVENT_TYPE_ASYNC_EXECUTE = 7; + EVENT_TYPE_PUBSUB_PUBLISH = 8; + EVENT_TYPE_PUBSUB_CONSUME = 9; } enum AsyncExecuteEventType { @@ -112,6 +114,28 @@ message AsyncExecuteEvent { optional string error = 7; } +message PubSubPublishEvent { + string deployment_key = 1; + optional string request_key = 2; + schema.Ref verb_ref = 3; + google.protobuf.Timestamp time_stamp = 4; + google.protobuf.Duration duration = 5; + string topic = 6; + string request = 7; + optional string error = 8; +} + +message PubSubConsumeEvent { + string deployment_key = 1; + optional string request_key = 2; + optional string dest_verb_module = 3; + optional string dest_verb_name = 4; + google.protobuf.Timestamp time_stamp = 5; + google.protobuf.Duration duration = 6; + string topic = 7; + optional string error = 8; +} + message Config { schema.Config config = 1; repeated schema.Ref references = 2; @@ -288,6 +312,8 @@ message Event { IngressEvent ingress = 7; CronScheduledEvent cron_scheduled = 8; AsyncExecuteEvent async_execute = 9; + PubSubPublishEvent pubsub_publish = 10; + PubSubConsumeEvent pubsub_consume = 11; } } diff --git a/frontend/console/src/features/timeline/Timeline.tsx b/frontend/console/src/features/timeline/Timeline.tsx index bf8d527c19..3e7336f9c9 100644 --- a/frontend/console/src/features/timeline/Timeline.tsx +++ b/frontend/console/src/features/timeline/Timeline.tsx @@ -14,6 +14,8 @@ import { TimelineDetailsHeader } from './details/TimelineDetailsHeader.tsx' import { TimelineIngressDetails } from './details/TimelineIngressDetails.tsx' import { TimelineLogDetails } from './details/TimelineLogDetails.tsx' import type { TimeSettings } from './filters/TimelineTimeControls.tsx' +import { TimelinePubSubPublishDetails } from './details/TimelinePubSubPublishDetails.tsx' +import { TimelinePubSubConsumeDetails } from './details/TimelinePubSubConsumeDetails.tsx' export const Timeline = ({ timeSettings, filters }: { timeSettings: TimeSettings; filters: EventsQuery_Filter[] }) => { const [searchParams, setSearchParams] = useSearchParams() @@ -70,6 +72,12 @@ export const Timeline = ({ timeSettings, filters }: { timeSettings: TimeSettings case 'asyncExecute': openPanel(, , handlePanelClosed) break + case 'pubsubPublish': + openPanel(, , handlePanelClosed) + break + case 'pubsubConsume': + openPanel(, , handlePanelClosed) + break default: break } diff --git a/frontend/console/src/features/timeline/TimelineEventList.tsx b/frontend/console/src/features/timeline/TimelineEventList.tsx index b5ade85188..e8b484add6 100644 --- a/frontend/console/src/features/timeline/TimelineEventList.tsx +++ b/frontend/console/src/features/timeline/TimelineEventList.tsx @@ -9,6 +9,8 @@ import { TimelineDeploymentUpdated } from './TimelineDeploymentUpdated' import { TimelineIcon } from './TimelineIcon' import { TimelineIngress } from './TimelineIngress' import { TimelineLog } from './TimelineLog' +import { TimelinePubSubConsume } from './TimelinePubSubConsume' +import { TimelinePubSubPublish } from './TimelinePubSubPublish' interface EventTimelineProps { events: Event[] @@ -23,6 +25,8 @@ const deploymentKey = (event: Event) => { case 'ingress': case 'cronScheduled': case 'asyncExecute': + case 'pubsubConsume': + case 'pubsubPublish': return event.entry.value.deploymentKey case 'deploymentCreated': case 'deploymentUpdated': @@ -77,6 +81,10 @@ export const TimelineEventList = ({ events, selectedEventId, handleEntryClicked return case 'asyncExecute': return + case 'pubsubPublish': + return + case 'pubsubConsume': + return default: return null } diff --git a/frontend/console/src/features/timeline/TimelineIcon.tsx b/frontend/console/src/features/timeline/TimelineIcon.tsx index c31b9a42bc..551424ce84 100644 --- a/frontend/console/src/features/timeline/TimelineIcon.tsx +++ b/frontend/console/src/features/timeline/TimelineIcon.tsx @@ -1,4 +1,4 @@ -import { Call02Icon, CallIncoming04Icon, CustomerServiceIcon, Menu01Icon, PackageReceiveIcon, Rocket01Icon, TimeQuarterPassIcon } from 'hugeicons-react' +import { Call02Icon, CallIncoming04Icon, CustomerServiceIcon, Menu01Icon, PackageReceiveIcon, Rocket01Icon, SatelliteIcon, Satellite03Icon, TimeQuarterPassIcon } from 'hugeicons-react' import type { Event } from '../../protos/xyz/block/ftl/v1/console/console_pb' import { LogLevelBadgeSmall } from '../logs/LogLevelBadgeSmall' import { eventTextColor } from './timeline.utils' @@ -24,6 +24,10 @@ export const TimelineIcon = ({ event }: { event: Event }) => { return case 'asyncExecute': return + case 'pubsubPublish': + return + case 'pubsubConsume': + return default: return } diff --git a/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx new file mode 100644 index 0000000000..aef9506245 --- /dev/null +++ b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx @@ -0,0 +1,23 @@ +import { PubSubConsumeEvent } from "../../protos/xyz/block/ftl/v1/console/console_pb"; + +export const TimelinePubSubConsume = ({ pubSubConsume }: { pubSubConsume: PubSubConsumeEvent }) => { + var title = `Topic ${pubSubConsume.topic} propagated by controller` + var consumedBy = undefined + if (pubSubConsume.destVerbName) { + consumedBy = `${pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}.${pubSubConsume.destVerbName}` + title = `Topic ${pubSubConsume.topic} consumed by ${consumedBy}` + } + + return ( + + {'Topic '} + ${pubSubConsume.topic} + {consumedBy && + <> + {' consumed by '} + {pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}{pubSubConsume.destVerbName || 'unknown'} + + || ' propagated by controller'} + + ) +} diff --git a/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx b/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx new file mode 100644 index 0000000000..143d614d55 --- /dev/null +++ b/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx @@ -0,0 +1,17 @@ +import type { PubSubPublishEvent } from "../../protos/xyz/block/ftl/v1/console/console_pb"; +import { refString } from "../verbs/verb.utils"; + +export const TimelinePubSubPublish = ({ pubSubPublish }: { pubSubPublish: PubSubPublishEvent }) => { + const title = `${pubSubPublish.verbRef?.module ? `${refString(pubSubPublish.verbRef)} -> ` : ''} topic ${pubSubPublish.topic}` + return ( + + {pubSubPublish.verbRef?.module && ( + <> + {refString(pubSubPublish.verbRef)} + {' published to topic '} + + )} + ${pubSubPublish.topic} + + ) +} diff --git a/frontend/console/src/features/timeline/details/TimelineDetailsHeader.tsx b/frontend/console/src/features/timeline/details/TimelineDetailsHeader.tsx index fa733a6ff6..7c23a07bbb 100644 --- a/frontend/console/src/features/timeline/details/TimelineDetailsHeader.tsx +++ b/frontend/console/src/features/timeline/details/TimelineDetailsHeader.tsx @@ -81,7 +81,18 @@ const eventBadge = (event: Event) => { {event.entry.value.path} ) - + case 'pubsubPublish': + return ( +
+ {event.entry.value.topic} +
+ ) + case 'pubsubConsume': + return ( +
+ {event.entry.value.topic} +
+ ) default: return '' } diff --git a/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx new file mode 100644 index 0000000000..3dd5e6864e --- /dev/null +++ b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx @@ -0,0 +1,34 @@ +import { AttributeBadge } from "../../../components/AttributeBadge"; +import type { Event, PubSubConsumeEvent } from "../../../protos/xyz/block/ftl/v1/console/console_pb"; +import { formatDuration } from "../../../utils/date.utils"; +import { DeploymentCard } from "../../../features/deployments/DeploymentCard"; +import { TraceGraph } from "../../../features/traces/TraceGraph"; +import { TraceGraphHeader } from "../../../features/traces/TraceGraphHeader"; + +export const TimelinePubSubConsumeDetails = ({ event }: { event: Event }) => { + const pubSubConsume = event.entry.value as PubSubConsumeEvent; + const destModule = `${pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}${pubSubConsume.destVerbName || 'unknown'}` + + return ( + <> +
+ + + + + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+ + ) +} diff --git a/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx b/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx new file mode 100644 index 0000000000..8bbd87c877 --- /dev/null +++ b/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx @@ -0,0 +1,34 @@ +import { AttributeBadge } from '../../../components/AttributeBadge' +import type { Event, PubSubPublishEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' +import { refString } from '../../../features/verbs/verb.utils' +import { formatDuration } from '../../../utils/date.utils' +import { DeploymentCard } from '../../../features/deployments/DeploymentCard' +import { TraceGraph } from '../../../features/traces/TraceGraph' +import { TraceGraphHeader } from '../../../features/traces/TraceGraphHeader' + +export const TimelinePubSubPublishDetails = ({ event }: { event: Event }) => { + const pubSubPublish = event.entry.value as PubSubPublishEvent + + return ( + <> +
+ + + + + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+ + ) +} diff --git a/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx b/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx index 716c5f4f9f..cd8ab3a617 100644 --- a/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx +++ b/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx @@ -1,4 +1,4 @@ -import { Call02Icon, CustomerServiceIcon, PackageReceiveIcon, Rocket01Icon, TimeQuarterPassIcon } from 'hugeicons-react' +import { Call02Icon, CustomerServiceIcon, PackageReceiveIcon, Rocket01Icon, SatelliteIcon, Satellite03Icon, TimeQuarterPassIcon } from 'hugeicons-react' import type React from 'react' import { useEffect, useState } from 'react' import { useModules } from '../../../api/modules/use-modules' @@ -31,6 +31,8 @@ const EVENT_TYPES: Record = { }, ingress: { label: 'Ingress', type: EventType.INGRESS, icon: }, cronScheduled: { label: 'Cron Scheduled', type: EventType.CRON_SCHEDULED, icon: }, + pubsubPublish: { label: 'PubSub Publish', type: EventType.PUBSUB_PUBLISH, icon: }, + pubsubConsume: { label: 'PubSub Consume', type: EventType.PUBSUB_CONSUME, icon: }, } const LOG_LEVELS: Record = { diff --git a/frontend/console/src/features/timeline/timeline.utils.ts b/frontend/console/src/features/timeline/timeline.utils.ts index 6500173c8f..e7e62bd0aa 100644 --- a/frontend/console/src/features/timeline/timeline.utils.ts +++ b/frontend/console/src/features/timeline/timeline.utils.ts @@ -9,6 +9,8 @@ const eventBackgroundColorMap: Record = { deploymentUpdated: 'bg-green-500 dark:bg-green-300', cronScheduled: 'bg-blue-500', asyncExecute: 'bg-indigo-500', + pubsubPublish: 'bg-violet-500', + pubsubConsume: 'bg-violet-500', '': 'bg-gray-500', } @@ -27,6 +29,8 @@ const eventTextColorMap: Record = { deploymentUpdated: 'text-green-500 dark:text-green-300', cronScheduled: 'text-blue-500', asyncExecute: 'text-indigo-500', + pubsubPublish: 'text-violet-500', + pubsubConsume: 'text-violet-500', '': 'text-gray-500', } diff --git a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts index 87d5289934..49e28ffe31 100644 --- a/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts +++ b/frontend/console/src/protos/xyz/block/ftl/v1/console/console_pb.ts @@ -50,6 +50,16 @@ export enum EventType { * @generated from enum value: EVENT_TYPE_ASYNC_EXECUTE = 7; */ ASYNC_EXECUTE = 7, + + /** + * @generated from enum value: EVENT_TYPE_PUBSUB_PUBLISH = 8; + */ + PUBSUB_PUBLISH = 8, + + /** + * @generated from enum value: EVENT_TYPE_PUBSUB_CONSUME = 9; + */ + PUBSUB_CONSUME = 9, } // Retrieve enum metadata with: proto3.getEnumType(EventType) proto3.util.setEnumType(EventType, "xyz.block.ftl.v1.console.EventType", [ @@ -61,6 +71,8 @@ proto3.util.setEnumType(EventType, "xyz.block.ftl.v1.console.EventType", [ { no: 5, name: "EVENT_TYPE_INGRESS" }, { no: 6, name: "EVENT_TYPE_CRON_SCHEDULED" }, { no: 7, name: "EVENT_TYPE_ASYNC_EXECUTE" }, + { no: 8, name: "EVENT_TYPE_PUBSUB_PUBLISH" }, + { no: 9, name: "EVENT_TYPE_PUBSUB_CONSUME" }, ]); /** @@ -668,6 +680,164 @@ export class AsyncExecuteEvent extends Message { } } +/** + * @generated from message xyz.block.ftl.v1.console.PubSubPublishEvent + */ +export class PubSubPublishEvent extends Message { + /** + * @generated from field: string deployment_key = 1; + */ + deploymentKey = ""; + + /** + * @generated from field: optional string request_key = 2; + */ + requestKey?: string; + + /** + * @generated from field: xyz.block.ftl.v1.schema.Ref verb_ref = 3; + */ + verbRef?: Ref; + + /** + * @generated from field: google.protobuf.Timestamp time_stamp = 4; + */ + timeStamp?: Timestamp; + + /** + * @generated from field: google.protobuf.Duration duration = 5; + */ + duration?: Duration; + + /** + * @generated from field: string topic = 6; + */ + topic = ""; + + /** + * @generated from field: string request = 7; + */ + request = ""; + + /** + * @generated from field: optional string error = 8; + */ + error?: string; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.PubSubPublishEvent"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "deployment_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "request_key", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "verb_ref", kind: "message", T: Ref }, + { no: 4, name: "time_stamp", kind: "message", T: Timestamp }, + { no: 5, name: "duration", kind: "message", T: Duration }, + { no: 6, name: "topic", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "request", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 8, name: "error", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PubSubPublishEvent { + return new PubSubPublishEvent().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PubSubPublishEvent { + return new PubSubPublishEvent().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PubSubPublishEvent { + return new PubSubPublishEvent().fromJsonString(jsonString, options); + } + + static equals(a: PubSubPublishEvent | PlainMessage | undefined, b: PubSubPublishEvent | PlainMessage | undefined): boolean { + return proto3.util.equals(PubSubPublishEvent, a, b); + } +} + +/** + * @generated from message xyz.block.ftl.v1.console.PubSubConsumeEvent + */ +export class PubSubConsumeEvent extends Message { + /** + * @generated from field: string deployment_key = 1; + */ + deploymentKey = ""; + + /** + * @generated from field: optional string request_key = 2; + */ + requestKey?: string; + + /** + * @generated from field: optional string dest_verb_module = 3; + */ + destVerbModule?: string; + + /** + * @generated from field: optional string dest_verb_name = 4; + */ + destVerbName?: string; + + /** + * @generated from field: google.protobuf.Timestamp time_stamp = 5; + */ + timeStamp?: Timestamp; + + /** + * @generated from field: google.protobuf.Duration duration = 6; + */ + duration?: Duration; + + /** + * @generated from field: string topic = 7; + */ + topic = ""; + + /** + * @generated from field: optional string error = 8; + */ + error?: string; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "xyz.block.ftl.v1.console.PubSubConsumeEvent"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "deployment_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "request_key", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "dest_verb_module", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 4, name: "dest_verb_name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 5, name: "time_stamp", kind: "message", T: Timestamp }, + { no: 6, name: "duration", kind: "message", T: Duration }, + { no: 7, name: "topic", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 8, name: "error", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PubSubConsumeEvent { + return new PubSubConsumeEvent().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PubSubConsumeEvent { + return new PubSubConsumeEvent().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PubSubConsumeEvent { + return new PubSubConsumeEvent().fromJsonString(jsonString, options); + } + + static equals(a: PubSubConsumeEvent | PlainMessage | undefined, b: PubSubConsumeEvent | PlainMessage | undefined): boolean { + return proto3.util.equals(PubSubConsumeEvent, a, b); + } +} + /** * @generated from message xyz.block.ftl.v1.console.Config */ @@ -2094,6 +2264,18 @@ export class Event extends Message { */ value: AsyncExecuteEvent; case: "asyncExecute"; + } | { + /** + * @generated from field: xyz.block.ftl.v1.console.PubSubPublishEvent pubsub_publish = 10; + */ + value: PubSubPublishEvent; + case: "pubsubPublish"; + } | { + /** + * @generated from field: xyz.block.ftl.v1.console.PubSubConsumeEvent pubsub_consume = 11; + */ + value: PubSubConsumeEvent; + case: "pubsubConsume"; } | { case: undefined; value?: undefined } = { case: undefined }; constructor(data?: PartialMessage) { @@ -2113,6 +2295,8 @@ export class Event extends Message { { no: 7, name: "ingress", kind: "message", T: IngressEvent, oneof: "entry" }, { no: 8, name: "cron_scheduled", kind: "message", T: CronScheduledEvent, oneof: "entry" }, { no: 9, name: "async_execute", kind: "message", T: AsyncExecuteEvent, oneof: "entry" }, + { no: 10, name: "pubsub_publish", kind: "message", T: PubSubPublishEvent, oneof: "entry" }, + { no: 11, name: "pubsub_consume", kind: "message", T: PubSubConsumeEvent, oneof: "entry" }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): Event { diff --git a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py index 7f41186609..6cea2da33e 100644 --- a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py +++ b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.py @@ -28,7 +28,7 @@ from xyz.block.ftl.v1.schema import schema_pb2 as xyz_dot_block_dot_ftl_dot_v1_dot_schema_dot_schema__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&xyz/block/ftl/v1/console/console.proto\x12\x18xyz.block.ftl.v1.console\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1axyz/block/ftl/v1/ftl.proto\x1a$xyz/block/ftl/v1/schema/schema.proto\"\xb6\x03\n\x08LogEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x1b\n\tlog_level\x18\x04 \x01(\x05R\x08logLevel\x12R\n\nattributes\x18\x05 \x03(\x0b\x32\x32.xyz.block.ftl.v1.console.LogEvent.AttributesEntryR\nattributes\x12\x18\n\x07message\x18\x06 \x01(\tR\x07message\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\x08 \x01(\tH\x02R\x05stack\x88\x01\x01\x1a=\n\x0f\x41ttributesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_errorB\x08\n\x06_stack\"\x95\x04\n\tCallEvent\x12$\n\x0brequest_key\x18\x01 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12I\n\x0fsource_verb_ref\x18\x0b \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefH\x01R\rsourceVerbRef\x88\x01\x01\x12N\n\x14\x64\x65stination_verb_ref\x18\x0c \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x12\x64\x65stinationVerbRef\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x1a\n\x08response\x18\x08 \x01(\tR\x08response\x12\x19\n\x05\x65rror\x18\t \x01(\tH\x02R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\n \x01(\tH\x03R\x05stack\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x12\n\x10_source_verb_refB\x08\n\x06_errorB\x08\n\x06_stackJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"\xb8\x01\n\x16\x44\x65ploymentCreatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x1a\n\x08language\x18\x02 \x01(\tR\x08language\x12\x1f\n\x0bmodule_name\x18\x03 \x01(\tR\nmoduleName\x12!\n\x0cmin_replicas\x18\x04 \x01(\x05R\x0bminReplicas\x12\x1f\n\x08replaced\x18\x05 \x01(\tH\x00R\x08replaced\x88\x01\x01\x42\x0b\n\t_replaced\"y\n\x16\x44\x65ploymentUpdatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12!\n\x0cmin_replicas\x18\x02 \x01(\x05R\x0bminReplicas\x12*\n\x11prev_min_replicas\x18\x03 \x01(\x05R\x0fprevMinReplicas\"\x8e\x04\n\x0cIngressEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x16\n\x06method\x18\x04 \x01(\tR\x06method\x12\x12\n\x04path\x18\x05 \x01(\tR\x04path\x12\x1f\n\x0bstatus_code\x18\x07 \x01(\x05R\nstatusCode\x12\x39\n\ntime_stamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\n \x01(\tR\x07request\x12%\n\x0erequest_header\x18\x0b \x01(\tR\rrequestHeader\x12\x1a\n\x08response\x18\x0c \x01(\tR\x08response\x12\'\n\x0fresponse_header\x18\r \x01(\tR\x0eresponseHeader\x12\x19\n\x05\x65rror\x18\x0e \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xe6\x02\n\x12\x43ronScheduledEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12\x37\n\x08verb_ref\x18\x02 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12=\n\x0cscheduled_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bscheduledAt\x12\x1a\n\x08schedule\x18\x06 \x01(\tR\x08schedule\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\x9b\x03\n\x11\x41syncExecuteEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12Y\n\x10\x61sync_event_type\x18\x06 \x01(\x0e\x32/.xyz.block.ftl.v1.console.AsyncExecuteEventTypeR\x0e\x61syncEventType\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\x7f\n\x06\x43onfig\x12\x37\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.ConfigR\x06\x63onfig\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8f\x01\n\x04\x44\x61ta\x12\x31\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.DataR\x04\x64\x61ta\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12<\n\nreferences\x18\x03 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x87\x01\n\x08\x44\x61tabase\x12=\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32!.xyz.block.ftl.v1.schema.DatabaseR\x08\x64\x61tabase\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"w\n\x04\x45num\x12\x31\n\x04\x65num\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.EnumR\x04\x65num\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"{\n\x05Topic\x12\x34\n\x05topic\x18\x01 \x01(\x0b\x32\x1e.xyz.block.ftl.v1.schema.TopicR\x05topic\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8b\x01\n\tTypeAlias\x12@\n\ttypealias\x18\x01 \x01(\x0b\x32\".xyz.block.ftl.v1.schema.TypeAliasR\ttypealias\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x7f\n\x06Secret\x12\x37\n\x06secret\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.SecretR\x06secret\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x97\x01\n\x0cSubscription\x12I\n\x0csubscription\x18\x01 \x01(\x0b\x32%.xyz.block.ftl.v1.schema.SubscriptionR\x0csubscription\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\xbf\x01\n\x04Verb\x12\x31\n\x04verb\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.VerbR\x04verb\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12.\n\x13json_request_schema\x18\x03 \x01(\tR\x11jsonRequestSchema\x12<\n\nreferences\x18\x04 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x9f\x05\n\x06Module\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x1a\n\x08language\x18\x03 \x01(\tR\x08language\x12\x16\n\x06schema\x18\x04 \x01(\tR\x06schema\x12\x34\n\x05verbs\x18\x05 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.VerbR\x05verbs\x12\x32\n\x04\x64\x61ta\x18\x06 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.DataR\x04\x64\x61ta\x12:\n\x07secrets\x18\x07 \x03(\x0b\x32 .xyz.block.ftl.v1.console.SecretR\x07secrets\x12:\n\x07\x63onfigs\x18\x08 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ConfigR\x07\x63onfigs\x12@\n\tdatabases\x18\t \x03(\x0b\x32\".xyz.block.ftl.v1.console.DatabaseR\tdatabases\x12\x34\n\x05\x65nums\x18\n \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.EnumR\x05\x65nums\x12\x37\n\x06topics\x18\x0b \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.TopicR\x06topics\x12\x45\n\x0btypealiases\x18\x0c \x03(\x0b\x32#.xyz.block.ftl.v1.console.TypeAliasR\x0btypealiases\x12L\n\rsubscriptions\x18\r \x03(\x0b\x32&.xyz.block.ftl.v1.console.SubscriptionR\rsubscriptions\")\n\rTopologyGroup\x12\x18\n\x07modules\x18\x01 \x03(\tR\x07modules\"K\n\x08Topology\x12?\n\x06levels\x18\x01 \x03(\x0b\x32\'.xyz.block.ftl.v1.console.TopologyGroupR\x06levels\"\x13\n\x11GetModulesRequest\"\x90\x01\n\x12GetModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\x12>\n\x08topology\x18\x02 \x01(\x0b\x32\".xyz.block.ftl.v1.console.TopologyR\x08topology\"\x16\n\x14StreamModulesRequest\"S\n\x15StreamModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\"\xe4\r\n\x0b\x45ventsQuery\x12\x46\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.xyz.block.ftl.v1.console.EventsQuery.FilterR\x07\x66ilters\x12\x14\n\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x41\n\x05order\x18\x03 \x01(\x0e\x32+.xyz.block.ftl.v1.console.EventsQuery.OrderR\x05order\x1a#\n\x0bLimitFilter\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x1aQ\n\x0eLogLevelFilter\x12?\n\tlog_level\x18\x01 \x01(\x0e\x32\".xyz.block.ftl.v1.console.LogLevelR\x08logLevel\x1a\x34\n\x10\x44\x65ploymentFilter\x12 \n\x0b\x64\x65ployments\x18\x01 \x03(\tR\x0b\x64\x65ployments\x1a+\n\rRequestFilter\x12\x1a\n\x08requests\x18\x01 \x03(\tR\x08requests\x1aW\n\x0f\x45ventTypeFilter\x12\x44\n\x0b\x65vent_types\x18\x01 \x03(\x0e\x32#.xyz.block.ftl.v1.console.EventTypeR\neventTypes\x1a\xaa\x01\n\nTimeFilter\x12>\n\nolder_than\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\tolderThan\x88\x01\x01\x12>\n\nnewer_than\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01R\tnewerThan\x88\x01\x01\x42\r\n\x0b_older_thanB\r\n\x0b_newer_than\x1as\n\x08IDFilter\x12\"\n\nlower_than\x18\x01 \x01(\x03H\x00R\tlowerThan\x88\x01\x01\x12$\n\x0bhigher_than\x18\x02 \x01(\x03H\x01R\nhigherThan\x88\x01\x01\x42\r\n\x0b_lower_thanB\x0e\n\x0c_higher_than\x1a\x99\x01\n\nCallFilter\x12\x1f\n\x0b\x64\x65st_module\x18\x01 \x01(\tR\ndestModule\x12 \n\tdest_verb\x18\x02 \x01(\tH\x00R\x08\x64\x65stVerb\x88\x01\x01\x12(\n\rsource_module\x18\x03 \x01(\tH\x01R\x0csourceModule\x88\x01\x01\x42\x0c\n\n_dest_verbB\x10\n\x0e_source_module\x1aH\n\x0cModuleFilter\x12\x16\n\x06module\x18\x01 \x01(\tR\x06module\x12\x17\n\x04verb\x18\x02 \x01(\tH\x00R\x04verb\x88\x01\x01\x42\x07\n\x05_verb\x1a\xdb\x05\n\x06\x46ilter\x12I\n\x05limit\x18\x01 \x01(\x0b\x32\x31.xyz.block.ftl.v1.console.EventsQuery.LimitFilterH\x00R\x05limit\x12S\n\tlog_level\x18\x02 \x01(\x0b\x32\x34.xyz.block.ftl.v1.console.EventsQuery.LogLevelFilterH\x00R\x08logLevel\x12Z\n\x0b\x64\x65ployments\x18\x03 \x01(\x0b\x32\x36.xyz.block.ftl.v1.console.EventsQuery.DeploymentFilterH\x00R\x0b\x64\x65ployments\x12Q\n\x08requests\x18\x04 \x01(\x0b\x32\x33.xyz.block.ftl.v1.console.EventsQuery.RequestFilterH\x00R\x08requests\x12X\n\x0b\x65vent_types\x18\x05 \x01(\x0b\x32\x35.xyz.block.ftl.v1.console.EventsQuery.EventTypeFilterH\x00R\neventTypes\x12\x46\n\x04time\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.TimeFilterH\x00R\x04time\x12@\n\x02id\x18\x07 \x01(\x0b\x32..xyz.block.ftl.v1.console.EventsQuery.IDFilterH\x00R\x02id\x12\x46\n\x04\x63\x61ll\x18\x08 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.CallFilterH\x00R\x04\x63\x61ll\x12L\n\x06module\x18\t \x01(\x0b\x32\x32.xyz.block.ftl.v1.console.EventsQuery.ModuleFilterH\x00R\x06moduleB\x08\n\x06\x66ilter\"\x1a\n\x05Order\x12\x07\n\x03\x41SC\x10\x00\x12\x08\n\x04\x44\x45SC\x10\x01\"\xaf\x01\n\x13StreamEventsRequest\x12G\n\x0fupdate_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00R\x0eupdateInterval\x88\x01\x01\x12;\n\x05query\x18\x02 \x01(\x0b\x32%.xyz.block.ftl.v1.console.EventsQueryR\x05queryB\x12\n\x10_update_interval\"O\n\x14StreamEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\"\x83\x05\n\x05\x45vent\x12\x39\n\ntime_stamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x0e\n\x02id\x18\x02 \x01(\x03R\x02id\x12\x36\n\x03log\x18\x03 \x01(\x0b\x32\".xyz.block.ftl.v1.console.LogEventH\x00R\x03log\x12\x39\n\x04\x63\x61ll\x18\x04 \x01(\x0b\x32#.xyz.block.ftl.v1.console.CallEventH\x00R\x04\x63\x61ll\x12\x61\n\x12\x64\x65ployment_created\x18\x05 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentCreatedEventH\x00R\x11\x64\x65ploymentCreated\x12\x61\n\x12\x64\x65ployment_updated\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentUpdatedEventH\x00R\x11\x64\x65ploymentUpdated\x12\x42\n\x07ingress\x18\x07 \x01(\x0b\x32&.xyz.block.ftl.v1.console.IngressEventH\x00R\x07ingress\x12U\n\x0e\x63ron_scheduled\x18\x08 \x01(\x0b\x32,.xyz.block.ftl.v1.console.CronScheduledEventH\x00R\rcronScheduled\x12R\n\rasync_execute\x18\t \x01(\x0b\x32+.xyz.block.ftl.v1.console.AsyncExecuteEventH\x00R\x0c\x61syncExecuteB\x07\n\x05\x65ntry\"t\n\x11GetEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\x12\x1b\n\x06\x63ursor\x18\x02 \x01(\x03H\x00R\x06\x63ursor\x88\x01\x01\x42\t\n\x07_cursor*\xe7\x01\n\tEventType\x12\x16\n\x12\x45VENT_TYPE_UNKNOWN\x10\x00\x12\x12\n\x0e\x45VENT_TYPE_LOG\x10\x01\x12\x13\n\x0f\x45VENT_TYPE_CALL\x10\x02\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_CREATED\x10\x03\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_UPDATED\x10\x04\x12\x16\n\x12\x45VENT_TYPE_INGRESS\x10\x05\x12\x1d\n\x19\x45VENT_TYPE_CRON_SCHEDULED\x10\x06\x12\x1c\n\x18\x45VENT_TYPE_ASYNC_EXECUTE\x10\x07*\x85\x01\n\x15\x41syncExecuteEventType\x12$\n ASYNC_EXECUTE_EVENT_TYPE_UNKNOWN\x10\x00\x12!\n\x1d\x41SYNC_EXECUTE_EVENT_TYPE_CRON\x10\x01\x12#\n\x1f\x41SYNC_EXECUTE_EVENT_TYPE_PUBSUB\x10\x02*\x88\x01\n\x08LogLevel\x12\x15\n\x11LOG_LEVEL_UNKNOWN\x10\x00\x12\x13\n\x0fLOG_LEVEL_TRACE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x05\x12\x12\n\x0eLOG_LEVEL_INFO\x10\t\x12\x12\n\x0eLOG_LEVEL_WARN\x10\r\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x11\x32\x8b\x04\n\x0e\x43onsoleService\x12J\n\x04Ping\x12\x1d.xyz.block.ftl.v1.PingRequest\x1a\x1e.xyz.block.ftl.v1.PingResponse\"\x03\x90\x02\x01\x12g\n\nGetModules\x12+.xyz.block.ftl.v1.console.GetModulesRequest\x1a,.xyz.block.ftl.v1.console.GetModulesResponse\x12r\n\rStreamModules\x12..xyz.block.ftl.v1.console.StreamModulesRequest\x1a/.xyz.block.ftl.v1.console.StreamModulesResponse0\x01\x12o\n\x0cStreamEvents\x12-.xyz.block.ftl.v1.console.StreamEventsRequest\x1a..xyz.block.ftl.v1.console.StreamEventsResponse0\x01\x12_\n\tGetEvents\x12%.xyz.block.ftl.v1.console.EventsQuery\x1a+.xyz.block.ftl.v1.console.GetEventsResponseBPP\x01ZLgithub.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/console;pbconsoleb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&xyz/block/ftl/v1/console/console.proto\x12\x18xyz.block.ftl.v1.console\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1axyz/block/ftl/v1/ftl.proto\x1a$xyz/block/ftl/v1/schema/schema.proto\"\xb6\x03\n\x08LogEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x1b\n\tlog_level\x18\x04 \x01(\x05R\x08logLevel\x12R\n\nattributes\x18\x05 \x03(\x0b\x32\x32.xyz.block.ftl.v1.console.LogEvent.AttributesEntryR\nattributes\x12\x18\n\x07message\x18\x06 \x01(\tR\x07message\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\x08 \x01(\tH\x02R\x05stack\x88\x01\x01\x1a=\n\x0f\x41ttributesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_errorB\x08\n\x06_stack\"\x95\x04\n\tCallEvent\x12$\n\x0brequest_key\x18\x01 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12I\n\x0fsource_verb_ref\x18\x0b \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefH\x01R\rsourceVerbRef\x88\x01\x01\x12N\n\x14\x64\x65stination_verb_ref\x18\x0c \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x12\x64\x65stinationVerbRef\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x1a\n\x08response\x18\x08 \x01(\tR\x08response\x12\x19\n\x05\x65rror\x18\t \x01(\tH\x02R\x05\x65rror\x88\x01\x01\x12\x19\n\x05stack\x18\n \x01(\tH\x03R\x05stack\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x12\n\x10_source_verb_refB\x08\n\x06_errorB\x08\n\x06_stackJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"\xb8\x01\n\x16\x44\x65ploymentCreatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x1a\n\x08language\x18\x02 \x01(\tR\x08language\x12\x1f\n\x0bmodule_name\x18\x03 \x01(\tR\nmoduleName\x12!\n\x0cmin_replicas\x18\x04 \x01(\x05R\x0bminReplicas\x12\x1f\n\x08replaced\x18\x05 \x01(\tH\x00R\x08replaced\x88\x01\x01\x42\x0b\n\t_replaced\"y\n\x16\x44\x65ploymentUpdatedEvent\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12!\n\x0cmin_replicas\x18\x02 \x01(\x05R\x0bminReplicas\x12*\n\x11prev_min_replicas\x18\x03 \x01(\x05R\x0fprevMinReplicas\"\x8e\x04\n\x0cIngressEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x16\n\x06method\x18\x04 \x01(\tR\x06method\x12\x12\n\x04path\x18\x05 \x01(\tR\x04path\x12\x1f\n\x0bstatus_code\x18\x07 \x01(\x05R\nstatusCode\x12\x39\n\ntime_stamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\t \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x18\n\x07request\x18\n \x01(\tR\x07request\x12%\n\x0erequest_header\x18\x0b \x01(\tR\rrequestHeader\x12\x1a\n\x08response\x18\x0c \x01(\tR\x08response\x12\'\n\x0fresponse_header\x18\r \x01(\tR\x0eresponseHeader\x12\x19\n\x05\x65rror\x18\x0e \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xe6\x02\n\x12\x43ronScheduledEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12\x37\n\x08verb_ref\x18\x02 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12=\n\x0cscheduled_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0bscheduledAt\x12\x1a\n\x08schedule\x18\x06 \x01(\tR\x08schedule\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x00R\x05\x65rror\x88\x01\x01\x42\x08\n\x06_error\"\x9b\x03\n\x11\x41syncExecuteEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12Y\n\x10\x61sync_event_type\x18\x06 \x01(\x0e\x32/.xyz.block.ftl.v1.console.AsyncExecuteEventTypeR\x0e\x61syncEventType\x12\x19\n\x05\x65rror\x18\x07 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xf1\x02\n\x12PubSubPublishEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12\x37\n\x08verb_ref\x18\x03 \x01(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\x07verbRef\x12\x39\n\ntime_stamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x05 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x06 \x01(\tR\x05topic\x12\x18\n\x07request\x18\x07 \x01(\tR\x07request\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x01R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x08\n\x06_error\"\xa0\x03\n\x12PubSubConsumeEvent\x12%\n\x0e\x64\x65ployment_key\x18\x01 \x01(\tR\rdeploymentKey\x12$\n\x0brequest_key\x18\x02 \x01(\tH\x00R\nrequestKey\x88\x01\x01\x12-\n\x10\x64\x65st_verb_module\x18\x03 \x01(\tH\x01R\x0e\x64\x65stVerbModule\x88\x01\x01\x12)\n\x0e\x64\x65st_verb_name\x18\x04 \x01(\tH\x02R\x0c\x64\x65stVerbName\x88\x01\x01\x12\x39\n\ntime_stamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x35\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationR\x08\x64uration\x12\x14\n\x05topic\x18\x07 \x01(\tR\x05topic\x12\x19\n\x05\x65rror\x18\x08 \x01(\tH\x03R\x05\x65rror\x88\x01\x01\x42\x0e\n\x0c_request_keyB\x13\n\x11_dest_verb_moduleB\x11\n\x0f_dest_verb_nameB\x08\n\x06_error\"\x7f\n\x06\x43onfig\x12\x37\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.ConfigR\x06\x63onfig\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8f\x01\n\x04\x44\x61ta\x12\x31\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.DataR\x04\x64\x61ta\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12<\n\nreferences\x18\x03 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x87\x01\n\x08\x44\x61tabase\x12=\n\x08\x64\x61tabase\x18\x01 \x01(\x0b\x32!.xyz.block.ftl.v1.schema.DatabaseR\x08\x64\x61tabase\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"w\n\x04\x45num\x12\x31\n\x04\x65num\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.EnumR\x04\x65num\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"{\n\x05Topic\x12\x34\n\x05topic\x18\x01 \x01(\x0b\x32\x1e.xyz.block.ftl.v1.schema.TopicR\x05topic\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x8b\x01\n\tTypeAlias\x12@\n\ttypealias\x18\x01 \x01(\x0b\x32\".xyz.block.ftl.v1.schema.TypeAliasR\ttypealias\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x7f\n\x06Secret\x12\x37\n\x06secret\x18\x01 \x01(\x0b\x32\x1f.xyz.block.ftl.v1.schema.SecretR\x06secret\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x97\x01\n\x0cSubscription\x12I\n\x0csubscription\x18\x01 \x01(\x0b\x32%.xyz.block.ftl.v1.schema.SubscriptionR\x0csubscription\x12<\n\nreferences\x18\x02 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\xbf\x01\n\x04Verb\x12\x31\n\x04verb\x18\x01 \x01(\x0b\x32\x1d.xyz.block.ftl.v1.schema.VerbR\x04verb\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12.\n\x13json_request_schema\x18\x03 \x01(\tR\x11jsonRequestSchema\x12<\n\nreferences\x18\x04 \x03(\x0b\x32\x1c.xyz.block.ftl.v1.schema.RefR\nreferences\"\x9f\x05\n\x06Module\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12%\n\x0e\x64\x65ployment_key\x18\x02 \x01(\tR\rdeploymentKey\x12\x1a\n\x08language\x18\x03 \x01(\tR\x08language\x12\x16\n\x06schema\x18\x04 \x01(\tR\x06schema\x12\x34\n\x05verbs\x18\x05 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.VerbR\x05verbs\x12\x32\n\x04\x64\x61ta\x18\x06 \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.DataR\x04\x64\x61ta\x12:\n\x07secrets\x18\x07 \x03(\x0b\x32 .xyz.block.ftl.v1.console.SecretR\x07secrets\x12:\n\x07\x63onfigs\x18\x08 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ConfigR\x07\x63onfigs\x12@\n\tdatabases\x18\t \x03(\x0b\x32\".xyz.block.ftl.v1.console.DatabaseR\tdatabases\x12\x34\n\x05\x65nums\x18\n \x03(\x0b\x32\x1e.xyz.block.ftl.v1.console.EnumR\x05\x65nums\x12\x37\n\x06topics\x18\x0b \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.TopicR\x06topics\x12\x45\n\x0btypealiases\x18\x0c \x03(\x0b\x32#.xyz.block.ftl.v1.console.TypeAliasR\x0btypealiases\x12L\n\rsubscriptions\x18\r \x03(\x0b\x32&.xyz.block.ftl.v1.console.SubscriptionR\rsubscriptions\")\n\rTopologyGroup\x12\x18\n\x07modules\x18\x01 \x03(\tR\x07modules\"K\n\x08Topology\x12?\n\x06levels\x18\x01 \x03(\x0b\x32\'.xyz.block.ftl.v1.console.TopologyGroupR\x06levels\"\x13\n\x11GetModulesRequest\"\x90\x01\n\x12GetModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\x12>\n\x08topology\x18\x02 \x01(\x0b\x32\".xyz.block.ftl.v1.console.TopologyR\x08topology\"\x16\n\x14StreamModulesRequest\"S\n\x15StreamModulesResponse\x12:\n\x07modules\x18\x01 \x03(\x0b\x32 .xyz.block.ftl.v1.console.ModuleR\x07modules\"\xe4\r\n\x0b\x45ventsQuery\x12\x46\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.xyz.block.ftl.v1.console.EventsQuery.FilterR\x07\x66ilters\x12\x14\n\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x41\n\x05order\x18\x03 \x01(\x0e\x32+.xyz.block.ftl.v1.console.EventsQuery.OrderR\x05order\x1a#\n\x0bLimitFilter\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x1aQ\n\x0eLogLevelFilter\x12?\n\tlog_level\x18\x01 \x01(\x0e\x32\".xyz.block.ftl.v1.console.LogLevelR\x08logLevel\x1a\x34\n\x10\x44\x65ploymentFilter\x12 \n\x0b\x64\x65ployments\x18\x01 \x03(\tR\x0b\x64\x65ployments\x1a+\n\rRequestFilter\x12\x1a\n\x08requests\x18\x01 \x03(\tR\x08requests\x1aW\n\x0f\x45ventTypeFilter\x12\x44\n\x0b\x65vent_types\x18\x01 \x03(\x0e\x32#.xyz.block.ftl.v1.console.EventTypeR\neventTypes\x1a\xaa\x01\n\nTimeFilter\x12>\n\nolder_than\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\tolderThan\x88\x01\x01\x12>\n\nnewer_than\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01R\tnewerThan\x88\x01\x01\x42\r\n\x0b_older_thanB\r\n\x0b_newer_than\x1as\n\x08IDFilter\x12\"\n\nlower_than\x18\x01 \x01(\x03H\x00R\tlowerThan\x88\x01\x01\x12$\n\x0bhigher_than\x18\x02 \x01(\x03H\x01R\nhigherThan\x88\x01\x01\x42\r\n\x0b_lower_thanB\x0e\n\x0c_higher_than\x1a\x99\x01\n\nCallFilter\x12\x1f\n\x0b\x64\x65st_module\x18\x01 \x01(\tR\ndestModule\x12 \n\tdest_verb\x18\x02 \x01(\tH\x00R\x08\x64\x65stVerb\x88\x01\x01\x12(\n\rsource_module\x18\x03 \x01(\tH\x01R\x0csourceModule\x88\x01\x01\x42\x0c\n\n_dest_verbB\x10\n\x0e_source_module\x1aH\n\x0cModuleFilter\x12\x16\n\x06module\x18\x01 \x01(\tR\x06module\x12\x17\n\x04verb\x18\x02 \x01(\tH\x00R\x04verb\x88\x01\x01\x42\x07\n\x05_verb\x1a\xdb\x05\n\x06\x46ilter\x12I\n\x05limit\x18\x01 \x01(\x0b\x32\x31.xyz.block.ftl.v1.console.EventsQuery.LimitFilterH\x00R\x05limit\x12S\n\tlog_level\x18\x02 \x01(\x0b\x32\x34.xyz.block.ftl.v1.console.EventsQuery.LogLevelFilterH\x00R\x08logLevel\x12Z\n\x0b\x64\x65ployments\x18\x03 \x01(\x0b\x32\x36.xyz.block.ftl.v1.console.EventsQuery.DeploymentFilterH\x00R\x0b\x64\x65ployments\x12Q\n\x08requests\x18\x04 \x01(\x0b\x32\x33.xyz.block.ftl.v1.console.EventsQuery.RequestFilterH\x00R\x08requests\x12X\n\x0b\x65vent_types\x18\x05 \x01(\x0b\x32\x35.xyz.block.ftl.v1.console.EventsQuery.EventTypeFilterH\x00R\neventTypes\x12\x46\n\x04time\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.TimeFilterH\x00R\x04time\x12@\n\x02id\x18\x07 \x01(\x0b\x32..xyz.block.ftl.v1.console.EventsQuery.IDFilterH\x00R\x02id\x12\x46\n\x04\x63\x61ll\x18\x08 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.EventsQuery.CallFilterH\x00R\x04\x63\x61ll\x12L\n\x06module\x18\t \x01(\x0b\x32\x32.xyz.block.ftl.v1.console.EventsQuery.ModuleFilterH\x00R\x06moduleB\x08\n\x06\x66ilter\"\x1a\n\x05Order\x12\x07\n\x03\x41SC\x10\x00\x12\x08\n\x04\x44\x45SC\x10\x01\"\xaf\x01\n\x13StreamEventsRequest\x12G\n\x0fupdate_interval\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00R\x0eupdateInterval\x88\x01\x01\x12;\n\x05query\x18\x02 \x01(\x0b\x32%.xyz.block.ftl.v1.console.EventsQueryR\x05queryB\x12\n\x10_update_interval\"O\n\x14StreamEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\"\xb1\x06\n\x05\x45vent\x12\x39\n\ntime_stamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\ttimeStamp\x12\x0e\n\x02id\x18\x02 \x01(\x03R\x02id\x12\x36\n\x03log\x18\x03 \x01(\x0b\x32\".xyz.block.ftl.v1.console.LogEventH\x00R\x03log\x12\x39\n\x04\x63\x61ll\x18\x04 \x01(\x0b\x32#.xyz.block.ftl.v1.console.CallEventH\x00R\x04\x63\x61ll\x12\x61\n\x12\x64\x65ployment_created\x18\x05 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentCreatedEventH\x00R\x11\x64\x65ploymentCreated\x12\x61\n\x12\x64\x65ployment_updated\x18\x06 \x01(\x0b\x32\x30.xyz.block.ftl.v1.console.DeploymentUpdatedEventH\x00R\x11\x64\x65ploymentUpdated\x12\x42\n\x07ingress\x18\x07 \x01(\x0b\x32&.xyz.block.ftl.v1.console.IngressEventH\x00R\x07ingress\x12U\n\x0e\x63ron_scheduled\x18\x08 \x01(\x0b\x32,.xyz.block.ftl.v1.console.CronScheduledEventH\x00R\rcronScheduled\x12R\n\rasync_execute\x18\t \x01(\x0b\x32+.xyz.block.ftl.v1.console.AsyncExecuteEventH\x00R\x0c\x61syncExecute\x12U\n\x0epubsub_publish\x18\n \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubPublishEventH\x00R\rpubsubPublish\x12U\n\x0epubsub_consume\x18\x0b \x01(\x0b\x32,.xyz.block.ftl.v1.console.PubSubConsumeEventH\x00R\rpubsubConsumeB\x07\n\x05\x65ntry\"t\n\x11GetEventsResponse\x12\x37\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1f.xyz.block.ftl.v1.console.EventR\x06\x65vents\x12\x1b\n\x06\x63ursor\x18\x02 \x01(\x03H\x00R\x06\x63ursor\x88\x01\x01\x42\t\n\x07_cursor*\xa5\x02\n\tEventType\x12\x16\n\x12\x45VENT_TYPE_UNKNOWN\x10\x00\x12\x12\n\x0e\x45VENT_TYPE_LOG\x10\x01\x12\x13\n\x0f\x45VENT_TYPE_CALL\x10\x02\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_CREATED\x10\x03\x12!\n\x1d\x45VENT_TYPE_DEPLOYMENT_UPDATED\x10\x04\x12\x16\n\x12\x45VENT_TYPE_INGRESS\x10\x05\x12\x1d\n\x19\x45VENT_TYPE_CRON_SCHEDULED\x10\x06\x12\x1c\n\x18\x45VENT_TYPE_ASYNC_EXECUTE\x10\x07\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_PUBLISH\x10\x08\x12\x1d\n\x19\x45VENT_TYPE_PUBSUB_CONSUME\x10\t*\x85\x01\n\x15\x41syncExecuteEventType\x12$\n ASYNC_EXECUTE_EVENT_TYPE_UNKNOWN\x10\x00\x12!\n\x1d\x41SYNC_EXECUTE_EVENT_TYPE_CRON\x10\x01\x12#\n\x1f\x41SYNC_EXECUTE_EVENT_TYPE_PUBSUB\x10\x02*\x88\x01\n\x08LogLevel\x12\x15\n\x11LOG_LEVEL_UNKNOWN\x10\x00\x12\x13\n\x0fLOG_LEVEL_TRACE\x10\x01\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x05\x12\x12\n\x0eLOG_LEVEL_INFO\x10\t\x12\x12\n\x0eLOG_LEVEL_WARN\x10\r\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x11\x32\x8b\x04\n\x0e\x43onsoleService\x12J\n\x04Ping\x12\x1d.xyz.block.ftl.v1.PingRequest\x1a\x1e.xyz.block.ftl.v1.PingResponse\"\x03\x90\x02\x01\x12g\n\nGetModules\x12+.xyz.block.ftl.v1.console.GetModulesRequest\x1a,.xyz.block.ftl.v1.console.GetModulesResponse\x12r\n\rStreamModules\x12..xyz.block.ftl.v1.console.StreamModulesRequest\x1a/.xyz.block.ftl.v1.console.StreamModulesResponse0\x01\x12o\n\x0cStreamEvents\x12-.xyz.block.ftl.v1.console.StreamEventsRequest\x1a..xyz.block.ftl.v1.console.StreamEventsResponse0\x01\x12_\n\tGetEvents\x12%.xyz.block.ftl.v1.console.EventsQuery\x1a+.xyz.block.ftl.v1.console.GetEventsResponseBPP\x01ZLgithub.com/TBD54566975/ftl/backend/protos/xyz/block/ftl/v1/console;pbconsoleb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -40,12 +40,12 @@ _globals['_LOGEVENT_ATTRIBUTESENTRY']._serialized_options = b'8\001' _globals['_CONSOLESERVICE'].methods_by_name['Ping']._loaded_options = None _globals['_CONSOLESERVICE'].methods_by_name['Ping']._serialized_options = b'\220\002\001' - _globals['_EVENTTYPE']._serialized_start=7930 - _globals['_EVENTTYPE']._serialized_end=8161 - _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_start=8164 - _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_end=8297 - _globals['_LOGLEVEL']._serialized_start=8300 - _globals['_LOGLEVEL']._serialized_end=8436 + _globals['_EVENTTYPE']._serialized_start=8895 + _globals['_EVENTTYPE']._serialized_end=9188 + _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_start=9191 + _globals['_ASYNCEXECUTEEVENTTYPE']._serialized_end=9324 + _globals['_LOGLEVEL']._serialized_start=9327 + _globals['_LOGLEVEL']._serialized_end=9463 _globals['_LOGEVENT']._serialized_start=200 _globals['_LOGEVENT']._serialized_end=638 _globals['_LOGEVENT_ATTRIBUTESENTRY']._serialized_start=541 @@ -62,70 +62,74 @@ _globals['_CRONSCHEDULEDEVENT']._serialized_end=2374 _globals['_ASYNCEXECUTEEVENT']._serialized_start=2377 _globals['_ASYNCEXECUTEEVENT']._serialized_end=2788 - _globals['_CONFIG']._serialized_start=2790 - _globals['_CONFIG']._serialized_end=2917 - _globals['_DATA']._serialized_start=2920 - _globals['_DATA']._serialized_end=3063 - _globals['_DATABASE']._serialized_start=3066 - _globals['_DATABASE']._serialized_end=3201 - _globals['_ENUM']._serialized_start=3203 - _globals['_ENUM']._serialized_end=3322 - _globals['_TOPIC']._serialized_start=3324 - _globals['_TOPIC']._serialized_end=3447 - _globals['_TYPEALIAS']._serialized_start=3450 - _globals['_TYPEALIAS']._serialized_end=3589 - _globals['_SECRET']._serialized_start=3591 - _globals['_SECRET']._serialized_end=3718 - _globals['_SUBSCRIPTION']._serialized_start=3721 - _globals['_SUBSCRIPTION']._serialized_end=3872 - _globals['_VERB']._serialized_start=3875 - _globals['_VERB']._serialized_end=4066 - _globals['_MODULE']._serialized_start=4069 - _globals['_MODULE']._serialized_end=4740 - _globals['_TOPOLOGYGROUP']._serialized_start=4742 - _globals['_TOPOLOGYGROUP']._serialized_end=4783 - _globals['_TOPOLOGY']._serialized_start=4785 - _globals['_TOPOLOGY']._serialized_end=4860 - _globals['_GETMODULESREQUEST']._serialized_start=4862 - _globals['_GETMODULESREQUEST']._serialized_end=4881 - _globals['_GETMODULESRESPONSE']._serialized_start=4884 - _globals['_GETMODULESRESPONSE']._serialized_end=5028 - _globals['_STREAMMODULESREQUEST']._serialized_start=5030 - _globals['_STREAMMODULESREQUEST']._serialized_end=5052 - _globals['_STREAMMODULESRESPONSE']._serialized_start=5054 - _globals['_STREAMMODULESRESPONSE']._serialized_end=5137 - _globals['_EVENTSQUERY']._serialized_start=5140 - _globals['_EVENTSQUERY']._serialized_end=6904 - _globals['_EVENTSQUERY_LIMITFILTER']._serialized_start=5316 - _globals['_EVENTSQUERY_LIMITFILTER']._serialized_end=5351 - _globals['_EVENTSQUERY_LOGLEVELFILTER']._serialized_start=5353 - _globals['_EVENTSQUERY_LOGLEVELFILTER']._serialized_end=5434 - _globals['_EVENTSQUERY_DEPLOYMENTFILTER']._serialized_start=5436 - _globals['_EVENTSQUERY_DEPLOYMENTFILTER']._serialized_end=5488 - _globals['_EVENTSQUERY_REQUESTFILTER']._serialized_start=5490 - _globals['_EVENTSQUERY_REQUESTFILTER']._serialized_end=5533 - _globals['_EVENTSQUERY_EVENTTYPEFILTER']._serialized_start=5535 - _globals['_EVENTSQUERY_EVENTTYPEFILTER']._serialized_end=5622 - _globals['_EVENTSQUERY_TIMEFILTER']._serialized_start=5625 - _globals['_EVENTSQUERY_TIMEFILTER']._serialized_end=5795 - _globals['_EVENTSQUERY_IDFILTER']._serialized_start=5797 - _globals['_EVENTSQUERY_IDFILTER']._serialized_end=5912 - _globals['_EVENTSQUERY_CALLFILTER']._serialized_start=5915 - _globals['_EVENTSQUERY_CALLFILTER']._serialized_end=6068 - _globals['_EVENTSQUERY_MODULEFILTER']._serialized_start=6070 - _globals['_EVENTSQUERY_MODULEFILTER']._serialized_end=6142 - _globals['_EVENTSQUERY_FILTER']._serialized_start=6145 - _globals['_EVENTSQUERY_FILTER']._serialized_end=6876 - _globals['_EVENTSQUERY_ORDER']._serialized_start=6878 - _globals['_EVENTSQUERY_ORDER']._serialized_end=6904 - _globals['_STREAMEVENTSREQUEST']._serialized_start=6907 - _globals['_STREAMEVENTSREQUEST']._serialized_end=7082 - _globals['_STREAMEVENTSRESPONSE']._serialized_start=7084 - _globals['_STREAMEVENTSRESPONSE']._serialized_end=7163 - _globals['_EVENT']._serialized_start=7166 - _globals['_EVENT']._serialized_end=7809 - _globals['_GETEVENTSRESPONSE']._serialized_start=7811 - _globals['_GETEVENTSRESPONSE']._serialized_end=7927 - _globals['_CONSOLESERVICE']._serialized_start=8439 - _globals['_CONSOLESERVICE']._serialized_end=8962 + _globals['_PUBSUBPUBLISHEVENT']._serialized_start=2791 + _globals['_PUBSUBPUBLISHEVENT']._serialized_end=3160 + _globals['_PUBSUBCONSUMEEVENT']._serialized_start=3163 + _globals['_PUBSUBCONSUMEEVENT']._serialized_end=3579 + _globals['_CONFIG']._serialized_start=3581 + _globals['_CONFIG']._serialized_end=3708 + _globals['_DATA']._serialized_start=3711 + _globals['_DATA']._serialized_end=3854 + _globals['_DATABASE']._serialized_start=3857 + _globals['_DATABASE']._serialized_end=3992 + _globals['_ENUM']._serialized_start=3994 + _globals['_ENUM']._serialized_end=4113 + _globals['_TOPIC']._serialized_start=4115 + _globals['_TOPIC']._serialized_end=4238 + _globals['_TYPEALIAS']._serialized_start=4241 + _globals['_TYPEALIAS']._serialized_end=4380 + _globals['_SECRET']._serialized_start=4382 + _globals['_SECRET']._serialized_end=4509 + _globals['_SUBSCRIPTION']._serialized_start=4512 + _globals['_SUBSCRIPTION']._serialized_end=4663 + _globals['_VERB']._serialized_start=4666 + _globals['_VERB']._serialized_end=4857 + _globals['_MODULE']._serialized_start=4860 + _globals['_MODULE']._serialized_end=5531 + _globals['_TOPOLOGYGROUP']._serialized_start=5533 + _globals['_TOPOLOGYGROUP']._serialized_end=5574 + _globals['_TOPOLOGY']._serialized_start=5576 + _globals['_TOPOLOGY']._serialized_end=5651 + _globals['_GETMODULESREQUEST']._serialized_start=5653 + _globals['_GETMODULESREQUEST']._serialized_end=5672 + _globals['_GETMODULESRESPONSE']._serialized_start=5675 + _globals['_GETMODULESRESPONSE']._serialized_end=5819 + _globals['_STREAMMODULESREQUEST']._serialized_start=5821 + _globals['_STREAMMODULESREQUEST']._serialized_end=5843 + _globals['_STREAMMODULESRESPONSE']._serialized_start=5845 + _globals['_STREAMMODULESRESPONSE']._serialized_end=5928 + _globals['_EVENTSQUERY']._serialized_start=5931 + _globals['_EVENTSQUERY']._serialized_end=7695 + _globals['_EVENTSQUERY_LIMITFILTER']._serialized_start=6107 + _globals['_EVENTSQUERY_LIMITFILTER']._serialized_end=6142 + _globals['_EVENTSQUERY_LOGLEVELFILTER']._serialized_start=6144 + _globals['_EVENTSQUERY_LOGLEVELFILTER']._serialized_end=6225 + _globals['_EVENTSQUERY_DEPLOYMENTFILTER']._serialized_start=6227 + _globals['_EVENTSQUERY_DEPLOYMENTFILTER']._serialized_end=6279 + _globals['_EVENTSQUERY_REQUESTFILTER']._serialized_start=6281 + _globals['_EVENTSQUERY_REQUESTFILTER']._serialized_end=6324 + _globals['_EVENTSQUERY_EVENTTYPEFILTER']._serialized_start=6326 + _globals['_EVENTSQUERY_EVENTTYPEFILTER']._serialized_end=6413 + _globals['_EVENTSQUERY_TIMEFILTER']._serialized_start=6416 + _globals['_EVENTSQUERY_TIMEFILTER']._serialized_end=6586 + _globals['_EVENTSQUERY_IDFILTER']._serialized_start=6588 + _globals['_EVENTSQUERY_IDFILTER']._serialized_end=6703 + _globals['_EVENTSQUERY_CALLFILTER']._serialized_start=6706 + _globals['_EVENTSQUERY_CALLFILTER']._serialized_end=6859 + _globals['_EVENTSQUERY_MODULEFILTER']._serialized_start=6861 + _globals['_EVENTSQUERY_MODULEFILTER']._serialized_end=6933 + _globals['_EVENTSQUERY_FILTER']._serialized_start=6936 + _globals['_EVENTSQUERY_FILTER']._serialized_end=7667 + _globals['_EVENTSQUERY_ORDER']._serialized_start=7669 + _globals['_EVENTSQUERY_ORDER']._serialized_end=7695 + _globals['_STREAMEVENTSREQUEST']._serialized_start=7698 + _globals['_STREAMEVENTSREQUEST']._serialized_end=7873 + _globals['_STREAMEVENTSRESPONSE']._serialized_start=7875 + _globals['_STREAMEVENTSRESPONSE']._serialized_end=7954 + _globals['_EVENT']._serialized_start=7957 + _globals['_EVENT']._serialized_end=8774 + _globals['_GETEVENTSRESPONSE']._serialized_start=8776 + _globals['_GETEVENTSRESPONSE']._serialized_end=8892 + _globals['_CONSOLESERVICE']._serialized_start=9466 + _globals['_CONSOLESERVICE']._serialized_end=9989 # @@protoc_insertion_point(module_scope) diff --git a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi index 4a9be618bd..906d4e508e 100644 --- a/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi +++ b/python-runtime/ftl/src/ftl/protos/xyz/block/ftl/v1/console/console_pb2.pyi @@ -20,6 +20,8 @@ class EventType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): EVENT_TYPE_INGRESS: _ClassVar[EventType] EVENT_TYPE_CRON_SCHEDULED: _ClassVar[EventType] EVENT_TYPE_ASYNC_EXECUTE: _ClassVar[EventType] + EVENT_TYPE_PUBSUB_PUBLISH: _ClassVar[EventType] + EVENT_TYPE_PUBSUB_CONSUME: _ClassVar[EventType] class AsyncExecuteEventType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): __slots__ = () @@ -43,6 +45,8 @@ EVENT_TYPE_DEPLOYMENT_UPDATED: EventType EVENT_TYPE_INGRESS: EventType EVENT_TYPE_CRON_SCHEDULED: EventType EVENT_TYPE_ASYNC_EXECUTE: EventType +EVENT_TYPE_PUBSUB_PUBLISH: EventType +EVENT_TYPE_PUBSUB_CONSUME: EventType ASYNC_EXECUTE_EVENT_TYPE_UNKNOWN: AsyncExecuteEventType ASYNC_EXECUTE_EVENT_TYPE_CRON: AsyncExecuteEventType ASYNC_EXECUTE_EVENT_TYPE_PUBSUB: AsyncExecuteEventType @@ -194,6 +198,46 @@ class AsyncExecuteEvent(_message.Message): error: str def __init__(self, deployment_key: _Optional[str] = ..., request_key: _Optional[str] = ..., verb_ref: _Optional[_Union[_schema_pb2.Ref, _Mapping]] = ..., time_stamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., duration: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., async_event_type: _Optional[_Union[AsyncExecuteEventType, str]] = ..., error: _Optional[str] = ...) -> None: ... +class PubSubPublishEvent(_message.Message): + __slots__ = ("deployment_key", "request_key", "verb_ref", "time_stamp", "duration", "topic", "request", "error") + DEPLOYMENT_KEY_FIELD_NUMBER: _ClassVar[int] + REQUEST_KEY_FIELD_NUMBER: _ClassVar[int] + VERB_REF_FIELD_NUMBER: _ClassVar[int] + TIME_STAMP_FIELD_NUMBER: _ClassVar[int] + DURATION_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + REQUEST_FIELD_NUMBER: _ClassVar[int] + ERROR_FIELD_NUMBER: _ClassVar[int] + deployment_key: str + request_key: str + verb_ref: _schema_pb2.Ref + time_stamp: _timestamp_pb2.Timestamp + duration: _duration_pb2.Duration + topic: str + request: str + error: str + def __init__(self, deployment_key: _Optional[str] = ..., request_key: _Optional[str] = ..., verb_ref: _Optional[_Union[_schema_pb2.Ref, _Mapping]] = ..., time_stamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., duration: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., topic: _Optional[str] = ..., request: _Optional[str] = ..., error: _Optional[str] = ...) -> None: ... + +class PubSubConsumeEvent(_message.Message): + __slots__ = ("deployment_key", "request_key", "dest_verb_module", "dest_verb_name", "time_stamp", "duration", "topic", "error") + DEPLOYMENT_KEY_FIELD_NUMBER: _ClassVar[int] + REQUEST_KEY_FIELD_NUMBER: _ClassVar[int] + DEST_VERB_MODULE_FIELD_NUMBER: _ClassVar[int] + DEST_VERB_NAME_FIELD_NUMBER: _ClassVar[int] + TIME_STAMP_FIELD_NUMBER: _ClassVar[int] + DURATION_FIELD_NUMBER: _ClassVar[int] + TOPIC_FIELD_NUMBER: _ClassVar[int] + ERROR_FIELD_NUMBER: _ClassVar[int] + deployment_key: str + request_key: str + dest_verb_module: str + dest_verb_name: str + time_stamp: _timestamp_pb2.Timestamp + duration: _duration_pb2.Duration + topic: str + error: str + def __init__(self, deployment_key: _Optional[str] = ..., request_key: _Optional[str] = ..., dest_verb_module: _Optional[str] = ..., dest_verb_name: _Optional[str] = ..., time_stamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., duration: _Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., topic: _Optional[str] = ..., error: _Optional[str] = ...) -> None: ... + class Config(_message.Message): __slots__ = ("config", "references") CONFIG_FIELD_NUMBER: _ClassVar[int] @@ -443,7 +487,7 @@ class StreamEventsResponse(_message.Message): def __init__(self, events: _Optional[_Iterable[_Union[Event, _Mapping]]] = ...) -> None: ... class Event(_message.Message): - __slots__ = ("time_stamp", "id", "log", "call", "deployment_created", "deployment_updated", "ingress", "cron_scheduled", "async_execute") + __slots__ = ("time_stamp", "id", "log", "call", "deployment_created", "deployment_updated", "ingress", "cron_scheduled", "async_execute", "pubsub_publish", "pubsub_consume") TIME_STAMP_FIELD_NUMBER: _ClassVar[int] ID_FIELD_NUMBER: _ClassVar[int] LOG_FIELD_NUMBER: _ClassVar[int] @@ -453,6 +497,8 @@ class Event(_message.Message): INGRESS_FIELD_NUMBER: _ClassVar[int] CRON_SCHEDULED_FIELD_NUMBER: _ClassVar[int] ASYNC_EXECUTE_FIELD_NUMBER: _ClassVar[int] + PUBSUB_PUBLISH_FIELD_NUMBER: _ClassVar[int] + PUBSUB_CONSUME_FIELD_NUMBER: _ClassVar[int] time_stamp: _timestamp_pb2.Timestamp id: int log: LogEvent @@ -462,7 +508,9 @@ class Event(_message.Message): ingress: IngressEvent cron_scheduled: CronScheduledEvent async_execute: AsyncExecuteEvent - def __init__(self, time_stamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., id: _Optional[int] = ..., log: _Optional[_Union[LogEvent, _Mapping]] = ..., call: _Optional[_Union[CallEvent, _Mapping]] = ..., deployment_created: _Optional[_Union[DeploymentCreatedEvent, _Mapping]] = ..., deployment_updated: _Optional[_Union[DeploymentUpdatedEvent, _Mapping]] = ..., ingress: _Optional[_Union[IngressEvent, _Mapping]] = ..., cron_scheduled: _Optional[_Union[CronScheduledEvent, _Mapping]] = ..., async_execute: _Optional[_Union[AsyncExecuteEvent, _Mapping]] = ...) -> None: ... + pubsub_publish: PubSubPublishEvent + pubsub_consume: PubSubConsumeEvent + def __init__(self, time_stamp: _Optional[_Union[_timestamp_pb2.Timestamp, _Mapping]] = ..., id: _Optional[int] = ..., log: _Optional[_Union[LogEvent, _Mapping]] = ..., call: _Optional[_Union[CallEvent, _Mapping]] = ..., deployment_created: _Optional[_Union[DeploymentCreatedEvent, _Mapping]] = ..., deployment_updated: _Optional[_Union[DeploymentUpdatedEvent, _Mapping]] = ..., ingress: _Optional[_Union[IngressEvent, _Mapping]] = ..., cron_scheduled: _Optional[_Union[CronScheduledEvent, _Mapping]] = ..., async_execute: _Optional[_Union[AsyncExecuteEvent, _Mapping]] = ..., pubsub_publish: _Optional[_Union[PubSubPublishEvent, _Mapping]] = ..., pubsub_consume: _Optional[_Union[PubSubConsumeEvent, _Mapping]] = ...) -> None: ... class GetEventsResponse(_message.Message): __slots__ = ("events", "cursor") From ed7ec3bd0006f9df09c2325e9aaf375d4dabe39a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 4 Nov 2024 19:40:08 +0000 Subject: [PATCH 2/3] chore(autofmt): Automated formatting --- .../src/features/timeline/TimelineIcon.tsx | 12 +++++++- .../timeline/TimelinePubSubConsume.tsx | 14 ++++++---- .../timeline/TimelinePubSubPublish.tsx | 4 +-- .../details/TimelinePubSubConsumeDetails.tsx | 28 +++++++++---------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/frontend/console/src/features/timeline/TimelineIcon.tsx b/frontend/console/src/features/timeline/TimelineIcon.tsx index 551424ce84..b630ac25e2 100644 --- a/frontend/console/src/features/timeline/TimelineIcon.tsx +++ b/frontend/console/src/features/timeline/TimelineIcon.tsx @@ -1,4 +1,14 @@ -import { Call02Icon, CallIncoming04Icon, CustomerServiceIcon, Menu01Icon, PackageReceiveIcon, Rocket01Icon, SatelliteIcon, Satellite03Icon, TimeQuarterPassIcon } from 'hugeicons-react' +import { + Call02Icon, + CallIncoming04Icon, + CustomerServiceIcon, + Menu01Icon, + PackageReceiveIcon, + Rocket01Icon, + SatelliteIcon, + Satellite03Icon, + TimeQuarterPassIcon, +} from 'hugeicons-react' import type { Event } from '../../protos/xyz/block/ftl/v1/console/console_pb' import { LogLevelBadgeSmall } from '../logs/LogLevelBadgeSmall' import { eventTextColor } from './timeline.utils' diff --git a/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx index aef9506245..8cc0220800 100644 --- a/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx +++ b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx @@ -1,10 +1,10 @@ -import { PubSubConsumeEvent } from "../../protos/xyz/block/ftl/v1/console/console_pb"; +import { PubSubConsumeEvent } from '../../protos/xyz/block/ftl/v1/console/console_pb' export const TimelinePubSubConsume = ({ pubSubConsume }: { pubSubConsume: PubSubConsumeEvent }) => { var title = `Topic ${pubSubConsume.topic} propagated by controller` var consumedBy = undefined if (pubSubConsume.destVerbName) { - consumedBy = `${pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}.${pubSubConsume.destVerbName}` + consumedBy = `${(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''}.${pubSubConsume.destVerbName}` title = `Topic ${pubSubConsume.topic} consumed by ${consumedBy}` } @@ -12,12 +12,16 @@ export const TimelinePubSubConsume = ({ pubSubConsume }: { pubSubConsume: PubSub {'Topic '} ${pubSubConsume.topic} - {consumedBy && + {(consumedBy && ( <> {' consumed by '} - {pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}{pubSubConsume.destVerbName || 'unknown'} + + {(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''} + {pubSubConsume.destVerbName || 'unknown'} + - || ' propagated by controller'} + )) || + ' propagated by controller'} ) } diff --git a/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx b/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx index 143d614d55..d0d0edfe35 100644 --- a/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx +++ b/frontend/console/src/features/timeline/TimelinePubSubPublish.tsx @@ -1,5 +1,5 @@ -import type { PubSubPublishEvent } from "../../protos/xyz/block/ftl/v1/console/console_pb"; -import { refString } from "../verbs/verb.utils"; +import type { PubSubPublishEvent } from '../../protos/xyz/block/ftl/v1/console/console_pb' +import { refString } from '../verbs/verb.utils' export const TimelinePubSubPublish = ({ pubSubPublish }: { pubSubPublish: PubSubPublishEvent }) => { const title = `${pubSubPublish.verbRef?.module ? `${refString(pubSubPublish.verbRef)} -> ` : ''} topic ${pubSubPublish.topic}` diff --git a/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx index 3dd5e6864e..fe3d9736a9 100644 --- a/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx +++ b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx @@ -1,31 +1,31 @@ -import { AttributeBadge } from "../../../components/AttributeBadge"; -import type { Event, PubSubConsumeEvent } from "../../../protos/xyz/block/ftl/v1/console/console_pb"; -import { formatDuration } from "../../../utils/date.utils"; -import { DeploymentCard } from "../../../features/deployments/DeploymentCard"; -import { TraceGraph } from "../../../features/traces/TraceGraph"; -import { TraceGraphHeader } from "../../../features/traces/TraceGraphHeader"; +import { AttributeBadge } from '../../../components/AttributeBadge' +import type { Event, PubSubConsumeEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' +import { formatDuration } from '../../../utils/date.utils' +import { DeploymentCard } from '../../../features/deployments/DeploymentCard' +import { TraceGraph } from '../../../features/traces/TraceGraph' +import { TraceGraphHeader } from '../../../features/traces/TraceGraphHeader' export const TimelinePubSubConsumeDetails = ({ event }: { event: Event }) => { - const pubSubConsume = event.entry.value as PubSubConsumeEvent; - const destModule = `${pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.' || ''}${pubSubConsume.destVerbName || 'unknown'}` + const pubSubConsume = event.entry.value as PubSubConsumeEvent + const destModule = `${(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''}${pubSubConsume.destVerbName || 'unknown'}` return ( <> -
+
- + -
    +
    • - +
    • - +
    • - +
From 0b4f3c7d43668a4e1a5984fd07267cf882aeaa03 Mon Sep 17 00:00:00 2001 From: Safeer Jiwan Date: Mon, 4 Nov 2024 16:48:47 -0800 Subject: [PATCH 3/3] lint --- backend/controller/pubsub/internal/dal/dal.go | 10 ++++------ backend/controller/timeline/events_pubsub_consume.go | 2 +- backend/controller/timeline/events_pubsub_publish.go | 2 +- frontend/console/src/features/timeline/Timeline.tsx | 4 ++-- .../console/src/features/timeline/TimelineIcon.tsx | 2 +- .../src/features/timeline/TimelinePubSubConsume.tsx | 10 +++++----- .../timeline/details/TimelinePubSubConsumeDetails.tsx | 6 +++--- .../timeline/details/TimelinePubSubPublishDetails.tsx | 6 +++--- .../features/timeline/filters/TimelineFilterPanel.tsx | 2 +- 9 files changed, 21 insertions(+), 23 deletions(-) diff --git a/backend/controller/pubsub/internal/dal/dal.go b/backend/controller/pubsub/internal/dal/dal.go index d7b618dfb3..0313fe1fa4 100644 --- a/backend/controller/pubsub/internal/dal/dal.go +++ b/backend/controller/pubsub/internal/dal/dal.go @@ -150,17 +150,15 @@ func (d *DAL) ProgressSubscriptions(ctx context.Context, eventConsumptionDelay t return 0, err } if !nextCursor.Ready { - s := fmt.Sprintf("Skipping subscription %s because event is too new", subscription.Key) - logger.Tracef(s) - enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(s)) + logger.Tracef("Skipping subscription %s because event is too new", subscription.Key) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(fmt.Sprintf("Skipping subscription %s because event is too new", subscription.Key))) continue } subscriber, err := tx.db.GetRandomSubscriber(ctx, subscription.Key) if err != nil { - s := fmt.Sprintf("no subscriber for subscription %s", subscription.Key) - logger.Tracef(s) - enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(s)) + logger.Tracef("no subscriber for subscription %s", subscription.Key) + enqueueTimelineEvent(optional.None[schema.RefKey](), optional.Some(fmt.Sprintf("no subscriber for subscription %s", subscription.Key))) continue } diff --git a/backend/controller/timeline/events_pubsub_consume.go b/backend/controller/timeline/events_pubsub_consume.go index 881f45b380..66904dfae0 100644 --- a/backend/controller/timeline/events_pubsub_consume.go +++ b/backend/controller/timeline/events_pubsub_consume.go @@ -33,7 +33,7 @@ type PubSubConsume struct { Error optional.Option[string] } -func (e *PubSubConsume) toEvent() (Event, error) { +func (e *PubSubConsume) toEvent() (Event, error) { //nolint:unparam return &PubSubConsumeEvent{ PubSubConsume: *e, Duration: time.Since(e.Time), diff --git a/backend/controller/timeline/events_pubsub_publish.go b/backend/controller/timeline/events_pubsub_publish.go index 336b15a863..7541641cad 100644 --- a/backend/controller/timeline/events_pubsub_publish.go +++ b/backend/controller/timeline/events_pubsub_publish.go @@ -36,7 +36,7 @@ type PubSubPublish struct { Error optional.Option[string] } -func (e *PubSubPublish) toEvent() (Event, error) { +func (e *PubSubPublish) toEvent() (Event, error) { //nolint:unparam return &PubSubPublishEvent{ PubSubPublish: *e, Duration: time.Since(e.Time), diff --git a/frontend/console/src/features/timeline/Timeline.tsx b/frontend/console/src/features/timeline/Timeline.tsx index 3e7336f9c9..4db212a694 100644 --- a/frontend/console/src/features/timeline/Timeline.tsx +++ b/frontend/console/src/features/timeline/Timeline.tsx @@ -13,9 +13,9 @@ import { TimelineDeploymentUpdatedDetails } from './details/TimelineDeploymentUp import { TimelineDetailsHeader } from './details/TimelineDetailsHeader.tsx' import { TimelineIngressDetails } from './details/TimelineIngressDetails.tsx' import { TimelineLogDetails } from './details/TimelineLogDetails.tsx' -import type { TimeSettings } from './filters/TimelineTimeControls.tsx' -import { TimelinePubSubPublishDetails } from './details/TimelinePubSubPublishDetails.tsx' import { TimelinePubSubConsumeDetails } from './details/TimelinePubSubConsumeDetails.tsx' +import { TimelinePubSubPublishDetails } from './details/TimelinePubSubPublishDetails.tsx' +import type { TimeSettings } from './filters/TimelineTimeControls.tsx' export const Timeline = ({ timeSettings, filters }: { timeSettings: TimeSettings; filters: EventsQuery_Filter[] }) => { const [searchParams, setSearchParams] = useSearchParams() diff --git a/frontend/console/src/features/timeline/TimelineIcon.tsx b/frontend/console/src/features/timeline/TimelineIcon.tsx index b630ac25e2..7da77023b2 100644 --- a/frontend/console/src/features/timeline/TimelineIcon.tsx +++ b/frontend/console/src/features/timeline/TimelineIcon.tsx @@ -5,8 +5,8 @@ import { Menu01Icon, PackageReceiveIcon, Rocket01Icon, - SatelliteIcon, Satellite03Icon, + SatelliteIcon, TimeQuarterPassIcon, } from 'hugeicons-react' import type { Event } from '../../protos/xyz/block/ftl/v1/console/console_pb' diff --git a/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx index 8cc0220800..df2ff7c7fe 100644 --- a/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx +++ b/frontend/console/src/features/timeline/TimelinePubSubConsume.tsx @@ -1,10 +1,10 @@ -import { PubSubConsumeEvent } from '../../protos/xyz/block/ftl/v1/console/console_pb' +import type { PubSubConsumeEvent } from '../../protos/xyz/block/ftl/v1/console/console_pb' export const TimelinePubSubConsume = ({ pubSubConsume }: { pubSubConsume: PubSubConsumeEvent }) => { - var title = `Topic ${pubSubConsume.topic} propagated by controller` - var consumedBy = undefined + let title = `Topic ${pubSubConsume.topic} propagated by controller` + let consumedBy = undefined if (pubSubConsume.destVerbName) { - consumedBy = `${(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''}.${pubSubConsume.destVerbName}` + consumedBy = `${(pubSubConsume.destVerbModule && `${pubSubConsume.destVerbModule}.`) || ''}.${pubSubConsume.destVerbName}` title = `Topic ${pubSubConsume.topic} consumed by ${consumedBy}` } @@ -16,7 +16,7 @@ export const TimelinePubSubConsume = ({ pubSubConsume }: { pubSubConsume: PubSub <> {' consumed by '} - {(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''} + {(pubSubConsume.destVerbModule && `${pubSubConsume.destVerbModule}.`) || ''} {pubSubConsume.destVerbName || 'unknown'} diff --git a/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx index fe3d9736a9..dccdc95108 100644 --- a/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx +++ b/frontend/console/src/features/timeline/details/TimelinePubSubConsumeDetails.tsx @@ -1,13 +1,13 @@ import { AttributeBadge } from '../../../components/AttributeBadge' -import type { Event, PubSubConsumeEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' -import { formatDuration } from '../../../utils/date.utils' import { DeploymentCard } from '../../../features/deployments/DeploymentCard' import { TraceGraph } from '../../../features/traces/TraceGraph' import { TraceGraphHeader } from '../../../features/traces/TraceGraphHeader' +import type { Event, PubSubConsumeEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' +import { formatDuration } from '../../../utils/date.utils' export const TimelinePubSubConsumeDetails = ({ event }: { event: Event }) => { const pubSubConsume = event.entry.value as PubSubConsumeEvent - const destModule = `${(pubSubConsume.destVerbModule && pubSubConsume.destVerbModule + '.') || ''}${pubSubConsume.destVerbName || 'unknown'}` + const destModule = `${(pubSubConsume.destVerbModule && `${pubSubConsume.destVerbModule}.`) || ''}${pubSubConsume.destVerbName || 'unknown'}` return ( <> diff --git a/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx b/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx index 8bbd87c877..5f255d6c4d 100644 --- a/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx +++ b/frontend/console/src/features/timeline/details/TimelinePubSubPublishDetails.tsx @@ -1,10 +1,10 @@ import { AttributeBadge } from '../../../components/AttributeBadge' -import type { Event, PubSubPublishEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' -import { refString } from '../../../features/verbs/verb.utils' -import { formatDuration } from '../../../utils/date.utils' import { DeploymentCard } from '../../../features/deployments/DeploymentCard' import { TraceGraph } from '../../../features/traces/TraceGraph' import { TraceGraphHeader } from '../../../features/traces/TraceGraphHeader' +import { refString } from '../../../features/verbs/verb.utils' +import type { Event, PubSubPublishEvent } from '../../../protos/xyz/block/ftl/v1/console/console_pb' +import { formatDuration } from '../../../utils/date.utils' export const TimelinePubSubPublishDetails = ({ event }: { event: Event }) => { const pubSubPublish = event.entry.value as PubSubPublishEvent diff --git a/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx b/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx index cd8ab3a617..6ed79b704f 100644 --- a/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx +++ b/frontend/console/src/features/timeline/filters/TimelineFilterPanel.tsx @@ -1,4 +1,4 @@ -import { Call02Icon, CustomerServiceIcon, PackageReceiveIcon, Rocket01Icon, SatelliteIcon, Satellite03Icon, TimeQuarterPassIcon } from 'hugeicons-react' +import { Call02Icon, CustomerServiceIcon, PackageReceiveIcon, Rocket01Icon, Satellite03Icon, SatelliteIcon, TimeQuarterPassIcon } from 'hugeicons-react' import type React from 'react' import { useEffect, useState } from 'react' import { useModules } from '../../../api/modules/use-modules'