diff --git a/internal/gen/controller/api/services/list.pb.go b/internal/gen/controller/api/services/list.pb.go index 41a2421fdc..750d7837f0 100644 --- a/internal/gen/controller/api/services/list.pb.go +++ b/internal/gen/controller/api/services/list.pb.go @@ -126,35 +126,35 @@ func (ResourceType) EnumDescriptor() ([]byte, []int) { return file_controller_api_services_v1_list_proto_rawDescGZIP(), []int{0} } -// ListRefreshToken is used to create refresh -// tokens for list endpoints. -type ListRefreshToken struct { +// ListToken is used to maintain state +// between list endpoint invocations. It +// is never exposed to the user directly, +// only in its marshaled form. +type ListToken struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // When the refresh token was created. - CreatedTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=created_time,json=createdTime,proto3" json:"created_time,omitempty"` - // When the refresh token was last used. - UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=updated_time,json=updatedTime,proto3" json:"updated_time,omitempty"` - // The resource type listed. Used to ensure - // refresh tokens are not used between list methods. - ResourceType ResourceType `protobuf:"varint,3,opt,name=resource_type,json=resourceType,proto3,enum=controller.api.services.v1.ResourceType" json:"resource_type,omitempty"` - // A hash of the users grants - // at the time of the refresh token issuing. - GrantsHash []byte `protobuf:"bytes,4,opt,name=grants_hash,json=grantsHash,proto3" json:"grants_hash,omitempty"` - // The ID of the last item returned on the - // previous page. - LastItemId string `protobuf:"bytes,5,opt,name=last_item_id,json=lastItemId,proto3" json:"last_item_id,omitempty"` - // The updated_time of the last item returned on - // the previous page. This is needed - // in addition to the ID since it can change after - // the creation of the refresh token. - LastItemUpdatedTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_item_updated_time,json=lastItemUpdatedTime,proto3" json:"last_item_updated_time,omitempty"` -} - -func (x *ListRefreshToken) Reset() { - *x = ListRefreshToken{} + // when the token was created + CreateTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + // the resource type listed + ResourceType ResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=controller.api.services.v1.ResourceType" json:"resource_type,omitempty"` + // A hash of the users permissions + // at the time of the token issuing. + GrantsHash []byte `protobuf:"bytes,3,opt,name=grants_hash,json=grantsHash,proto3" json:"grants_hash,omitempty"` + // The subtype of the token. It changes + // between different stages of the pagination. + // + // Types that are assignable to Token: + // + // *ListToken_PaginationToken + // *ListToken_StartRefreshToken + // *ListToken_RefreshToken + Token isListToken_Token `protobuf_oneof:"token"` +} + +func (x *ListToken) Reset() { + *x = ListToken{} if protoimpl.UnsafeEnabled { mi := &file_controller_api_services_v1_list_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -162,13 +162,13 @@ func (x *ListRefreshToken) Reset() { } } -func (x *ListRefreshToken) String() string { +func (x *ListToken) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListRefreshToken) ProtoMessage() {} +func (*ListToken) ProtoMessage() {} -func (x *ListRefreshToken) ProtoReflect() protoreflect.Message { +func (x *ListToken) ProtoReflect() protoreflect.Message { mi := &file_controller_api_services_v1_list_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -180,49 +180,305 @@ func (x *ListRefreshToken) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListRefreshToken.ProtoReflect.Descriptor instead. -func (*ListRefreshToken) Descriptor() ([]byte, []int) { +// Deprecated: Use ListToken.ProtoReflect.Descriptor instead. +func (*ListToken) Descriptor() ([]byte, []int) { return file_controller_api_services_v1_list_proto_rawDescGZIP(), []int{0} } -func (x *ListRefreshToken) GetCreatedTime() *timestamppb.Timestamp { +func (x *ListToken) GetCreateTime() *timestamppb.Timestamp { if x != nil { - return x.CreatedTime + return x.CreateTime } return nil } -func (x *ListRefreshToken) GetUpdatedTime() *timestamppb.Timestamp { +func (x *ListToken) GetResourceType() ResourceType { + if x != nil { + return x.ResourceType + } + return ResourceType_RESOURCE_TYPE_UNSPECIFIED +} + +func (x *ListToken) GetGrantsHash() []byte { if x != nil { - return x.UpdatedTime + return x.GrantsHash + } + return nil +} + +func (m *ListToken) GetToken() isListToken_Token { + if m != nil { + return m.Token + } + return nil +} + +func (x *ListToken) GetPaginationToken() *PaginationToken { + if x, ok := x.GetToken().(*ListToken_PaginationToken); ok { + return x.PaginationToken + } + return nil +} + +func (x *ListToken) GetStartRefreshToken() *StartRefreshToken { + if x, ok := x.GetToken().(*ListToken_StartRefreshToken); ok { + return x.StartRefreshToken + } + return nil +} + +func (x *ListToken) GetRefreshToken() *RefreshToken { + if x, ok := x.GetToken().(*ListToken_RefreshToken); ok { + return x.RefreshToken } return nil } -func (x *ListRefreshToken) GetResourceType() ResourceType { +type isListToken_Token interface { + isListToken_Token() +} + +type ListToken_PaginationToken struct { + // Set for any responses from the initial pagination phase, + // except the last. + PaginationToken *PaginationToken `protobuf:"bytes,4,opt,name=pagination_token,json=paginationToken,proto3,oneof"` +} + +type ListToken_StartRefreshToken struct { + // Set for the final response of either phase to indicate the next request + // will be a new refresh pagination phase. + StartRefreshToken *StartRefreshToken `protobuf:"bytes,5,opt,name=start_refresh_token,json=startRefreshToken,proto3,oneof"` +} + +type ListToken_RefreshToken struct { + // Set in any response from a refresh phase pagination, + // except the last. + RefreshToken *RefreshToken `protobuf:"bytes,6,opt,name=refresh_token,json=refreshToken,proto3,oneof"` +} + +func (*ListToken_PaginationToken) isListToken_Token() {} + +func (*ListToken_StartRefreshToken) isListToken_Token() {} + +func (*ListToken_RefreshToken) isListToken_Token() {} + +// PaginationToken describes the list token subtype +// used during the initial pagination phase. +type PaginationToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The public ID of the last item that was included + // in the page which this token was returned with. + LastItemId string `protobuf:"bytes,1,opt,name=last_item_id,json=lastItemId,proto3" json:"last_item_id,omitempty"` + // The create time of the last item that was included + // in the page which this token was returned with. + LastItemCreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_item_create_time,json=lastItemCreateTime,proto3" json:"last_item_create_time,omitempty"` +} + +func (x *PaginationToken) Reset() { + *x = PaginationToken{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_services_v1_list_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PaginationToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PaginationToken) ProtoMessage() {} + +func (x *PaginationToken) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_services_v1_list_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PaginationToken.ProtoReflect.Descriptor instead. +func (*PaginationToken) Descriptor() ([]byte, []int) { + return file_controller_api_services_v1_list_proto_rawDescGZIP(), []int{1} +} + +func (x *PaginationToken) GetLastItemId() string { if x != nil { - return x.ResourceType + return x.LastItemId } - return ResourceType_RESOURCE_TYPE_UNSPECIFIED + return "" } -func (x *ListRefreshToken) GetGrantsHash() []byte { +func (x *PaginationToken) GetLastItemCreateTime() *timestamppb.Timestamp { if x != nil { - return x.GrantsHash + return x.LastItemCreateTime } return nil } -func (x *ListRefreshToken) GetLastItemId() string { +// StartRefreshToken describes the list token subtype +// used at the end of any pagination phase, both the +// initial and any refresh phases. +type StartRefreshToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The end time of the phase previous to this one, + // which should be used as the lower bound for the + // new refresh phase. + PreviousPhaseUpperBound *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=previous_phase_upper_bound,json=previousPhaseUpperBound,proto3" json:"previous_phase_upper_bound,omitempty"` + // The timestamp of the transaction that last listed the deleted IDs, + // for use as a lower bound in the next deleted IDs list. + PreviousDeletedIdsTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=previous_deleted_ids_time,json=previousDeletedIdsTime,proto3" json:"previous_deleted_ids_time,omitempty"` +} + +func (x *StartRefreshToken) Reset() { + *x = StartRefreshToken{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_services_v1_list_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartRefreshToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartRefreshToken) ProtoMessage() {} + +func (x *StartRefreshToken) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_services_v1_list_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartRefreshToken.ProtoReflect.Descriptor instead. +func (*StartRefreshToken) Descriptor() ([]byte, []int) { + return file_controller_api_services_v1_list_proto_rawDescGZIP(), []int{2} +} + +func (x *StartRefreshToken) GetPreviousPhaseUpperBound() *timestamppb.Timestamp { + if x != nil { + return x.PreviousPhaseUpperBound + } + return nil +} + +func (x *StartRefreshToken) GetPreviousDeletedIdsTime() *timestamppb.Timestamp { + if x != nil { + return x.PreviousDeletedIdsTime + } + return nil +} + +// RefreshToken describes the list token subtype used +// between pages in a refresh pagination phase. +type RefreshToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The upper bound for the timestamp comparisons in + // this refresh phase. This is equal to the time that + // the first request in this phase was processed. + // Constant for the lifetime of the refresh phase. + PhaseUpperBound *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=phase_upper_bound,json=phaseUpperBound,proto3" json:"phase_upper_bound,omitempty"` + // The lower bound for the timestamp comparisons in + // this refresh phase. This is equal to the initial + // create time of the token if the previous phase was + // the initial pagination phase, or the upper bound of + // the previous refresh phase otherwise. + // Constant for the lifetime of the refresh phase. + PhaseLowerBound *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=phase_lower_bound,json=phaseLowerBound,proto3" json:"phase_lower_bound,omitempty"` + // The timestamp of the transaction that last listed the deleted IDs, + // for use as a lower bound in the next deleted IDs list. + PreviousDeletedIdsTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=previous_deleted_ids_time,json=previousDeletedIdsTime,proto3" json:"previous_deleted_ids_time,omitempty"` + // The public ID of the last item that was included + // in the page which this token was returned with. + LastItemId string `protobuf:"bytes,4,opt,name=last_item_id,json=lastItemId,proto3" json:"last_item_id,omitempty"` + // The update time of the last item that was included + // in the page which this token was returned with. + LastItemUpdateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_item_update_time,json=lastItemUpdateTime,proto3" json:"last_item_update_time,omitempty"` +} + +func (x *RefreshToken) Reset() { + *x = RefreshToken{} + if protoimpl.UnsafeEnabled { + mi := &file_controller_api_services_v1_list_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RefreshToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RefreshToken) ProtoMessage() {} + +func (x *RefreshToken) ProtoReflect() protoreflect.Message { + mi := &file_controller_api_services_v1_list_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RefreshToken.ProtoReflect.Descriptor instead. +func (*RefreshToken) Descriptor() ([]byte, []int) { + return file_controller_api_services_v1_list_proto_rawDescGZIP(), []int{3} +} + +func (x *RefreshToken) GetPhaseUpperBound() *timestamppb.Timestamp { + if x != nil { + return x.PhaseUpperBound + } + return nil +} + +func (x *RefreshToken) GetPhaseLowerBound() *timestamppb.Timestamp { + if x != nil { + return x.PhaseLowerBound + } + return nil +} + +func (x *RefreshToken) GetPreviousDeletedIdsTime() *timestamppb.Timestamp { + if x != nil { + return x.PreviousDeletedIdsTime + } + return nil +} + +func (x *RefreshToken) GetLastItemId() string { if x != nil { return x.LastItemId } return "" } -func (x *ListRefreshToken) GetLastItemUpdatedTime() *timestamppb.Timestamp { +func (x *RefreshToken) GetLastItemUpdateTime() *timestamppb.Timestamp { if x != nil { - return x.LastItemUpdatedTime + return x.LastItemUpdateTime } return nil } @@ -236,73 +492,122 @@ var file_controller_api_services_v1_list_proto_rawDesc = []byte{ 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf3, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3d, 0x0a, 0x0c, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x16, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcd, 0x03, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 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, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x4d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x58, 0x0a, 0x10, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5f, 0x0a, 0x13, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4f, 0x0a, 0x0d, 0x72, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x15, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 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, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0xda, 0x04, 0x0a, 0x0c, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x48, - 0x4f, 0x44, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, - 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x04, - 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x52, 0x59, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, - 0x41, 0x4c, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, - 0x50, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x08, 0x12, 0x1e, 0x0a, 0x1a, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, - 0x54, 0x5f, 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x09, 0x12, 0x1a, 0x0a, 0x16, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, - 0x54, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x0c, - 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x10, 0x0d, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, - 0x4f, 0x4e, 0x10, 0x0e, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, - 0x43, 0x4f, 0x52, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x0f, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, - 0x47, 0x45, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x10, 0x12, 0x18, 0x0a, 0x14, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x10, 0x11, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x12, 0x12, 0x18, 0x0a, - 0x14, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, - 0x4f, 0x52, 0x4b, 0x45, 0x52, 0x10, 0x13, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x11, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x57, 0x0a, 0x1a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x68, 0x61, 0x73, + 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 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, + 0x17, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x50, 0x68, 0x61, 0x73, 0x65, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x55, 0x0a, 0x19, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x52, 0x16, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x49, 0x64, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x22, + 0xe6, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x46, 0x0a, 0x11, 0x70, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 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, 0x0f, 0x70, 0x68, 0x61, 0x73, 0x65, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x46, 0x0a, 0x11, 0x70, 0x68, 0x61, 0x73, + 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 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, 0x52, + 0x0f, 0x70, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x55, 0x0a, 0x19, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 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, + 0x16, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x15, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0xda, 0x04, 0x0a, 0x0c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, + 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x03, + 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x24, + 0x0a, 0x20, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x52, 0x59, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, + 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, + 0x07, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x08, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x5f, + 0x43, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x09, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x5f, + 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x17, + 0x0a, 0x13, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x43, 0x4f, 0x50, 0x45, 0x10, 0x0d, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x10, 0x0e, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x43, 0x4f, + 0x52, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x0f, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, + 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x10, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x10, 0x11, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x12, 0x12, 0x18, 0x0a, 0x14, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, + 0x4b, 0x45, 0x52, 0x10, 0x13, 0x42, 0x4d, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -318,22 +623,33 @@ func file_controller_api_services_v1_list_proto_rawDescGZIP() []byte { } var file_controller_api_services_v1_list_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_controller_api_services_v1_list_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_controller_api_services_v1_list_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_controller_api_services_v1_list_proto_goTypes = []interface{}{ (ResourceType)(0), // 0: controller.api.services.v1.ResourceType - (*ListRefreshToken)(nil), // 1: controller.api.services.v1.ListRefreshToken - (*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp + (*ListToken)(nil), // 1: controller.api.services.v1.ListToken + (*PaginationToken)(nil), // 2: controller.api.services.v1.PaginationToken + (*StartRefreshToken)(nil), // 3: controller.api.services.v1.StartRefreshToken + (*RefreshToken)(nil), // 4: controller.api.services.v1.RefreshToken + (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp } var file_controller_api_services_v1_list_proto_depIdxs = []int32{ - 2, // 0: controller.api.services.v1.ListRefreshToken.created_time:type_name -> google.protobuf.Timestamp - 2, // 1: controller.api.services.v1.ListRefreshToken.updated_time:type_name -> google.protobuf.Timestamp - 0, // 2: controller.api.services.v1.ListRefreshToken.resource_type:type_name -> controller.api.services.v1.ResourceType - 2, // 3: controller.api.services.v1.ListRefreshToken.last_item_updated_time:type_name -> google.protobuf.Timestamp - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 5, // 0: controller.api.services.v1.ListToken.create_time:type_name -> google.protobuf.Timestamp + 0, // 1: controller.api.services.v1.ListToken.resource_type:type_name -> controller.api.services.v1.ResourceType + 2, // 2: controller.api.services.v1.ListToken.pagination_token:type_name -> controller.api.services.v1.PaginationToken + 3, // 3: controller.api.services.v1.ListToken.start_refresh_token:type_name -> controller.api.services.v1.StartRefreshToken + 4, // 4: controller.api.services.v1.ListToken.refresh_token:type_name -> controller.api.services.v1.RefreshToken + 5, // 5: controller.api.services.v1.PaginationToken.last_item_create_time:type_name -> google.protobuf.Timestamp + 5, // 6: controller.api.services.v1.StartRefreshToken.previous_phase_upper_bound:type_name -> google.protobuf.Timestamp + 5, // 7: controller.api.services.v1.StartRefreshToken.previous_deleted_ids_time:type_name -> google.protobuf.Timestamp + 5, // 8: controller.api.services.v1.RefreshToken.phase_upper_bound:type_name -> google.protobuf.Timestamp + 5, // 9: controller.api.services.v1.RefreshToken.phase_lower_bound:type_name -> google.protobuf.Timestamp + 5, // 10: controller.api.services.v1.RefreshToken.previous_deleted_ids_time:type_name -> google.protobuf.Timestamp + 5, // 11: controller.api.services.v1.RefreshToken.last_item_update_time:type_name -> google.protobuf.Timestamp + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_controller_api_services_v1_list_proto_init() } @@ -343,7 +659,7 @@ func file_controller_api_services_v1_list_proto_init() { } if !protoimpl.UnsafeEnabled { file_controller_api_services_v1_list_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRefreshToken); i { + switch v := v.(*ListToken); i { case 0: return &v.state case 1: @@ -354,6 +670,47 @@ func file_controller_api_services_v1_list_proto_init() { return nil } } + file_controller_api_services_v1_list_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PaginationToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_services_v1_list_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartRefreshToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_controller_api_services_v1_list_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RefreshToken); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_controller_api_services_v1_list_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*ListToken_PaginationToken)(nil), + (*ListToken_StartRefreshToken)(nil), + (*ListToken_RefreshToken)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -361,7 +718,7 @@ func file_controller_api_services_v1_list_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_controller_api_services_v1_list_proto_rawDesc, NumEnums: 1, - NumMessages: 1, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/proto/controller/api/services/v1/list.proto b/internal/proto/controller/api/services/v1/list.proto index f38ba91a01..5aa982252f 100644 --- a/internal/proto/controller/api/services/v1/list.proto +++ b/internal/proto/controller/api/services/v1/list.proto @@ -9,27 +9,81 @@ import "google/protobuf/timestamp.proto"; option go_package = "github.com/hashicorp/boundary/internal/gen/controller/api/services;services"; -// ListRefreshToken is used to create refresh -// tokens for list endpoints. -message ListRefreshToken { - // When the refresh token was created. - google.protobuf.Timestamp created_time = 1; - // When the refresh token was last used. - google.protobuf.Timestamp updated_time = 2; - // The resource type listed. Used to ensure - // refresh tokens are not used between list methods. - ResourceType resource_type = 3; - // A hash of the users grants - // at the time of the refresh token issuing. - bytes grants_hash = 4; - // The ID of the last item returned on the - // previous page. - string last_item_id = 5; - // The updated_time of the last item returned on - // the previous page. This is needed - // in addition to the ID since it can change after - // the creation of the refresh token. - google.protobuf.Timestamp last_item_updated_time = 6; +// ListToken is used to maintain state +// between list endpoint invocations. It +// is never exposed to the user directly, +// only in its marshaled form. +message ListToken { + // when the token was created + google.protobuf.Timestamp create_time = 1; + // the resource type listed + ResourceType resource_type = 2; + // A hash of the users permissions + // at the time of the token issuing. + bytes grants_hash = 3; + // The subtype of the token. It changes + // between different stages of the pagination. + oneof token { + // Set for any responses from the initial pagination phase, + // except the last. + PaginationToken pagination_token = 4; + // Set for the final response of either phase to indicate the next request + // will be a new refresh pagination phase. + StartRefreshToken start_refresh_token = 5; + // Set in any response from a refresh phase pagination, + // except the last. + RefreshToken refresh_token = 6; + } +} + +// PaginationToken describes the list token subtype +// used during the initial pagination phase. +message PaginationToken { + // The public ID of the last item that was included + // in the page which this token was returned with. + string last_item_id = 1; + // The create time of the last item that was included + // in the page which this token was returned with. + google.protobuf.Timestamp last_item_create_time = 2; +} + +// StartRefreshToken describes the list token subtype +// used at the end of any pagination phase, both the +// initial and any refresh phases. +message StartRefreshToken { + // The end time of the phase previous to this one, + // which should be used as the lower bound for the + // new refresh phase. + google.protobuf.Timestamp previous_phase_upper_bound = 1; + // The timestamp of the transaction that last listed the deleted IDs, + // for use as a lower bound in the next deleted IDs list. + google.protobuf.Timestamp previous_deleted_ids_time = 2; +} + +// RefreshToken describes the list token subtype used +// between pages in a refresh pagination phase. +message RefreshToken { + // The upper bound for the timestamp comparisons in + // this refresh phase. This is equal to the time that + // the first request in this phase was processed. + // Constant for the lifetime of the refresh phase. + google.protobuf.Timestamp phase_upper_bound = 1; + // The lower bound for the timestamp comparisons in + // this refresh phase. This is equal to the initial + // create time of the token if the previous phase was + // the initial pagination phase, or the upper bound of + // the previous refresh phase otherwise. + // Constant for the lifetime of the refresh phase. + google.protobuf.Timestamp phase_lower_bound = 2; + // The timestamp of the transaction that last listed the deleted IDs, + // for use as a lower bound in the next deleted IDs list. + google.protobuf.Timestamp previous_deleted_ids_time = 3; + // The public ID of the last item that was included + // in the page which this token was returned with. + string last_item_id = 4; + // The update time of the last item that was included + // in the page which this token was returned with. + google.protobuf.Timestamp last_item_update_time = 5; } // ResourceType represents the different list