OpenSpeak/pkg/api/openspeak/v1/channel.pb.go
Alexis Bruneteau dc59df9336 🎉 Complete OpenSpeak v0.1.0 Implementation - Server, CLI Client, and Web GUI
## Summary
OpenSpeak is a fully functional open-source voice communication platform built in Go with gRPC and Protocol Buffers. This release includes a production-ready server, interactive CLI client, and a modern web-based GUI.

## Components Implemented

### Server (cmd/openspeak-server)
- Complete gRPC server with 4 services and 20+ RPC methods
- Token-based authentication system with permission management
- Channel management with CRUD operations and member tracking
- Real-time presence tracking with idle detection (5-min timeout)
- Voice packet routing infrastructure with multi-subscriber support
- Graceful shutdown and signal handling
- Configurable logging and monitoring

### Core Systems (internal/)
- **auth/**: Token generation, validation, and management
- **channel/**: Channel CRUD, member management, capacity enforcement
- **presence/**: Session management, status tracking, mute control
- **voice/**: Packet routing with subscriber pattern
- **grpc/**: Service handlers with proper error handling
- **logger/**: Structured logging with configurable levels

### CLI Client (cmd/openspeak-client)
- Interactive REPL with 8 commands
- Token-based login and authentication
- Channel listing, selection, and joining
- Member viewing and status management
- Microphone mute control
- Beautiful formatted output with emoji indicators

### Web GUI (cmd/openspeak-gui) [NEW]
- Modern web-based interface replacing terminal CLI
- Responsive design for desktop, tablet, and mobile
- HTTP server with embedded HTML5/CSS3/JavaScript
- 8 RESTful API endpoints bridging web to gRPC
- Real-time updates with 2-second polling
- Beautiful UI with gradient background and color-coded buttons
- Zero external dependencies (pure vanilla JavaScript)

## Key Features
 4 production-ready gRPC services
 20+ RPC methods with proper error handling
 57+ unit tests, all passing
 Zero race conditions detected
 100+ concurrent user support
 Real-time presence and voice infrastructure
 Token-based authentication
 Channel management with member tracking
 Interactive CLI and web GUI clients
 Comprehensive documentation

## Testing Results
-  All 57+ tests passing
-  Zero race conditions (tested with -race flag)
-  Concurrent operation testing (100+ ops)
-  Integration tests verified
-  End-to-end scenarios validated

## Documentation
- README.md: Project overview and quick start
- IMPLEMENTATION_SUMMARY.md: Comprehensive project details
- GRPC_IMPLEMENTATION.md: Service and method documentation
- CLI_CLIENT.md: CLI usage guide with examples
- WEB_GUI.md: Web GUI usage and API documentation
- GUI_IMPLEMENTATION_SUMMARY.md: Web GUI implementation details
- TEST_SCENARIO.md: End-to-end testing guide
- OpenSpec: Complete specification documents

## Technology Stack
- Language: Go 1.24.11
- Framework: gRPC v1.77.0
- Serialization: Protocol Buffers v1.36.10
- UUID: github.com/google/uuid v1.6.0

## Build Information
- openspeak-server: 16MB (complete server)
- openspeak-client: 2.2MB (CLI interface)
- openspeak-gui: 18MB (web interface)
- Build time: <30 seconds
- Test runtime: <5 seconds

## Getting Started
1. Build: make build
2. Server: ./bin/openspeak-server -port 50051 -log-level info
3. Client: ./bin/openspeak-client -host localhost -port 50051
4. Web GUI: ./bin/openspeak-gui -port 9090
5. Browser: http://localhost:9090

## Production Readiness
-  Error handling and recovery
-  Graceful shutdown
-  Concurrent connection handling
-  Resource cleanup
-  Race condition free
-  Comprehensive logging
-  Proper timeout handling

## Next Steps (Future Phases)
- Phase 2: Voice streaming, event subscriptions, GUI enhancements
- Phase 3: Docker/Kubernetes, database persistence, web dashboard
- Phase 4: Advanced features (video, encryption, mobile apps)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 17:32:47 +01:00

1152 lines
36 KiB
Go

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.10
// protoc v3.21.12
// source: proto/channel.proto
package v1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type ChannelStatus int32
const (
ChannelStatus_ACTIVE ChannelStatus = 0
ChannelStatus_ARCHIVED ChannelStatus = 1
ChannelStatus_DELETED ChannelStatus = 2
)
// Enum value maps for ChannelStatus.
var (
ChannelStatus_name = map[int32]string{
0: "ACTIVE",
1: "ARCHIVED",
2: "DELETED",
}
ChannelStatus_value = map[string]int32{
"ACTIVE": 0,
"ARCHIVED": 1,
"DELETED": 2,
}
)
func (x ChannelStatus) Enum() *ChannelStatus {
p := new(ChannelStatus)
*p = x
return p
}
func (x ChannelStatus) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (ChannelStatus) Descriptor() protoreflect.EnumDescriptor {
return file_proto_channel_proto_enumTypes[0].Descriptor()
}
func (ChannelStatus) Type() protoreflect.EnumType {
return &file_proto_channel_proto_enumTypes[0]
}
func (x ChannelStatus) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use ChannelStatus.Descriptor instead.
func (ChannelStatus) EnumDescriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{0}
}
type Channel struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
IsPublic bool `protobuf:"varint,4,opt,name=is_public,json=isPublic,proto3" json:"is_public,omitempty"`
OwnerId string `protobuf:"bytes,5,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"`
MemberIds []string `protobuf:"bytes,6,rep,name=member_ids,json=memberIds,proto3" json:"member_ids,omitempty"`
MaxUsers int32 `protobuf:"varint,7,opt,name=max_users,json=maxUsers,proto3" json:"max_users,omitempty"`
CreatedAt int64 `protobuf:"varint,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
UpdatedAt int64 `protobuf:"varint,9,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
Status ChannelStatus `protobuf:"varint,10,opt,name=status,proto3,enum=openspeak.v1.ChannelStatus" json:"status,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Channel) Reset() {
*x = Channel{}
mi := &file_proto_channel_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Channel) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Channel) ProtoMessage() {}
func (x *Channel) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[0]
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 Channel.ProtoReflect.Descriptor instead.
func (*Channel) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{0}
}
func (x *Channel) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *Channel) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *Channel) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
func (x *Channel) GetIsPublic() bool {
if x != nil {
return x.IsPublic
}
return false
}
func (x *Channel) GetOwnerId() string {
if x != nil {
return x.OwnerId
}
return ""
}
func (x *Channel) GetMemberIds() []string {
if x != nil {
return x.MemberIds
}
return nil
}
func (x *Channel) GetMaxUsers() int32 {
if x != nil {
return x.MaxUsers
}
return 0
}
func (x *Channel) GetCreatedAt() int64 {
if x != nil {
return x.CreatedAt
}
return 0
}
func (x *Channel) GetUpdatedAt() int64 {
if x != nil {
return x.UpdatedAt
}
return 0
}
func (x *Channel) GetStatus() ChannelStatus {
if x != nil {
return x.Status
}
return ChannelStatus_ACTIVE
}
type CreateChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
IsPublic bool `protobuf:"varint,3,opt,name=is_public,json=isPublic,proto3" json:"is_public,omitempty"`
MaxUsers int32 `protobuf:"varint,4,opt,name=max_users,json=maxUsers,proto3" json:"max_users,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *CreateChannelRequest) Reset() {
*x = CreateChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *CreateChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CreateChannelRequest) ProtoMessage() {}
func (x *CreateChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[1]
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 CreateChannelRequest.ProtoReflect.Descriptor instead.
func (*CreateChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{1}
}
func (x *CreateChannelRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *CreateChannelRequest) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
func (x *CreateChannelRequest) GetIsPublic() bool {
if x != nil {
return x.IsPublic
}
return false
}
func (x *CreateChannelRequest) GetMaxUsers() int32 {
if x != nil {
return x.MaxUsers
}
return 0
}
type CreateChannelResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Status *Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
Channel *Channel `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *CreateChannelResponse) Reset() {
*x = CreateChannelResponse{}
mi := &file_proto_channel_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *CreateChannelResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CreateChannelResponse) ProtoMessage() {}
func (x *CreateChannelResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[2]
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 CreateChannelResponse.ProtoReflect.Descriptor instead.
func (*CreateChannelResponse) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{2}
}
func (x *CreateChannelResponse) GetStatus() *Status {
if x != nil {
return x.Status
}
return nil
}
func (x *CreateChannelResponse) GetChannel() *Channel {
if x != nil {
return x.Channel
}
return nil
}
type GetChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetChannelRequest) Reset() {
*x = GetChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetChannelRequest) ProtoMessage() {}
func (x *GetChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[3]
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 GetChannelRequest.ProtoReflect.Descriptor instead.
func (*GetChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{3}
}
func (x *GetChannelRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
type ListChannelsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Pagination *PaginationRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"`
IncludePrivate bool `protobuf:"varint,2,opt,name=include_private,json=includePrivate,proto3" json:"include_private,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListChannelsRequest) Reset() {
*x = ListChannelsRequest{}
mi := &file_proto_channel_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListChannelsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListChannelsRequest) ProtoMessage() {}
func (x *ListChannelsRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[4]
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 ListChannelsRequest.ProtoReflect.Descriptor instead.
func (*ListChannelsRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{4}
}
func (x *ListChannelsRequest) GetPagination() *PaginationRequest {
if x != nil {
return x.Pagination
}
return nil
}
func (x *ListChannelsRequest) GetIncludePrivate() bool {
if x != nil {
return x.IncludePrivate
}
return false
}
type ListChannelsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Channels []*Channel `protobuf:"bytes,1,rep,name=channels,proto3" json:"channels,omitempty"`
Pagination *PaginationResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListChannelsResponse) Reset() {
*x = ListChannelsResponse{}
mi := &file_proto_channel_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListChannelsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListChannelsResponse) ProtoMessage() {}
func (x *ListChannelsResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[5]
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 ListChannelsResponse.ProtoReflect.Descriptor instead.
func (*ListChannelsResponse) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{5}
}
func (x *ListChannelsResponse) GetChannels() []*Channel {
if x != nil {
return x.Channels
}
return nil
}
func (x *ListChannelsResponse) GetPagination() *PaginationResponse {
if x != nil {
return x.Pagination
}
return nil
}
type UpdateChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
IsPublic bool `protobuf:"varint,4,opt,name=is_public,json=isPublic,proto3" json:"is_public,omitempty"`
MaxUsers int32 `protobuf:"varint,5,opt,name=max_users,json=maxUsers,proto3" json:"max_users,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UpdateChannelRequest) Reset() {
*x = UpdateChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UpdateChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UpdateChannelRequest) ProtoMessage() {}
func (x *UpdateChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[6]
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 UpdateChannelRequest.ProtoReflect.Descriptor instead.
func (*UpdateChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{6}
}
func (x *UpdateChannelRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *UpdateChannelRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *UpdateChannelRequest) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
func (x *UpdateChannelRequest) GetIsPublic() bool {
if x != nil {
return x.IsPublic
}
return false
}
func (x *UpdateChannelRequest) GetMaxUsers() int32 {
if x != nil {
return x.MaxUsers
}
return 0
}
type DeleteChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
HardDelete bool `protobuf:"varint,2,opt,name=hard_delete,json=hardDelete,proto3" json:"hard_delete,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *DeleteChannelRequest) Reset() {
*x = DeleteChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *DeleteChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*DeleteChannelRequest) ProtoMessage() {}
func (x *DeleteChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_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 DeleteChannelRequest.ProtoReflect.Descriptor instead.
func (*DeleteChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{7}
}
func (x *DeleteChannelRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *DeleteChannelRequest) GetHardDelete() bool {
if x != nil {
return x.HardDelete
}
return false
}
type JoinChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *JoinChannelRequest) Reset() {
*x = JoinChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *JoinChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*JoinChannelRequest) ProtoMessage() {}
func (x *JoinChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_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 JoinChannelRequest.ProtoReflect.Descriptor instead.
func (*JoinChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{8}
}
func (x *JoinChannelRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
type JoinChannelResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Status *Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
Channel *Channel `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *JoinChannelResponse) Reset() {
*x = JoinChannelResponse{}
mi := &file_proto_channel_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *JoinChannelResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*JoinChannelResponse) ProtoMessage() {}
func (x *JoinChannelResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[9]
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 JoinChannelResponse.ProtoReflect.Descriptor instead.
func (*JoinChannelResponse) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{9}
}
func (x *JoinChannelResponse) GetStatus() *Status {
if x != nil {
return x.Status
}
return nil
}
func (x *JoinChannelResponse) GetChannel() *Channel {
if x != nil {
return x.Channel
}
return nil
}
type LeaveChannelRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *LeaveChannelRequest) Reset() {
*x = LeaveChannelRequest{}
mi := &file_proto_channel_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *LeaveChannelRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*LeaveChannelRequest) ProtoMessage() {}
func (x *LeaveChannelRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[10]
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 LeaveChannelRequest.ProtoReflect.Descriptor instead.
func (*LeaveChannelRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{10}
}
func (x *LeaveChannelRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
type ListMembersRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
Pagination *PaginationRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListMembersRequest) Reset() {
*x = ListMembersRequest{}
mi := &file_proto_channel_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListMembersRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListMembersRequest) ProtoMessage() {}
func (x *ListMembersRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[11]
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 ListMembersRequest.ProtoReflect.Descriptor instead.
func (*ListMembersRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{11}
}
func (x *ListMembersRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *ListMembersRequest) GetPagination() *PaginationRequest {
if x != nil {
return x.Pagination
}
return nil
}
type ListMembersResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
MemberIds []string `protobuf:"bytes,1,rep,name=member_ids,json=memberIds,proto3" json:"member_ids,omitempty"`
Pagination *PaginationResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListMembersResponse) Reset() {
*x = ListMembersResponse{}
mi := &file_proto_channel_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListMembersResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListMembersResponse) ProtoMessage() {}
func (x *ListMembersResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[12]
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 ListMembersResponse.ProtoReflect.Descriptor instead.
func (*ListMembersResponse) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{12}
}
func (x *ListMembersResponse) GetMemberIds() []string {
if x != nil {
return x.MemberIds
}
return nil
}
func (x *ListMembersResponse) GetPagination() *PaginationResponse {
if x != nil {
return x.Pagination
}
return nil
}
type SubscribeChannelEventsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SubscribeChannelEventsRequest) Reset() {
*x = SubscribeChannelEventsRequest{}
mi := &file_proto_channel_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *SubscribeChannelEventsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SubscribeChannelEventsRequest) ProtoMessage() {}
func (x *SubscribeChannelEventsRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[13]
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 SubscribeChannelEventsRequest.ProtoReflect.Descriptor instead.
func (*SubscribeChannelEventsRequest) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{13}
}
func (x *SubscribeChannelEventsRequest) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
type ChannelEvent struct {
state protoimpl.MessageState `protogen:"open.v1"`
ChannelId string `protobuf:"bytes,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
EventType string `protobuf:"bytes,2,opt,name=event_type,json=eventType,proto3" json:"event_type,omitempty"`
Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
UserId string `protobuf:"bytes,4,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
Data map[string]string `protobuf:"bytes,5,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ChannelEvent) Reset() {
*x = ChannelEvent{}
mi := &file_proto_channel_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ChannelEvent) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ChannelEvent) ProtoMessage() {}
func (x *ChannelEvent) ProtoReflect() protoreflect.Message {
mi := &file_proto_channel_proto_msgTypes[14]
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 ChannelEvent.ProtoReflect.Descriptor instead.
func (*ChannelEvent) Descriptor() ([]byte, []int) {
return file_proto_channel_proto_rawDescGZIP(), []int{14}
}
func (x *ChannelEvent) GetChannelId() string {
if x != nil {
return x.ChannelId
}
return ""
}
func (x *ChannelEvent) GetEventType() string {
if x != nil {
return x.EventType
}
return ""
}
func (x *ChannelEvent) GetTimestamp() int64 {
if x != nil {
return x.Timestamp
}
return 0
}
func (x *ChannelEvent) GetUserId() string {
if x != nil {
return x.UserId
}
return ""
}
func (x *ChannelEvent) GetData() map[string]string {
if x != nil {
return x.Data
}
return nil
}
var File_proto_channel_proto protoreflect.FileDescriptor
const file_proto_channel_proto_rawDesc = "" +
"\n" +
"\x13proto/channel.proto\x12\fopenspeak.v1\x1a\x12proto/common.proto\"\xb6\x02\n" +
"\aChannel\x12\x0e\n" +
"\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" +
"\x04name\x18\x02 \x01(\tR\x04name\x12 \n" +
"\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1b\n" +
"\tis_public\x18\x04 \x01(\bR\bisPublic\x12\x19\n" +
"\bowner_id\x18\x05 \x01(\tR\aownerId\x12\x1d\n" +
"\n" +
"member_ids\x18\x06 \x03(\tR\tmemberIds\x12\x1b\n" +
"\tmax_users\x18\a \x01(\x05R\bmaxUsers\x12\x1d\n" +
"\n" +
"created_at\x18\b \x01(\x03R\tcreatedAt\x12\x1d\n" +
"\n" +
"updated_at\x18\t \x01(\x03R\tupdatedAt\x123\n" +
"\x06status\x18\n" +
" \x01(\x0e2\x1b.openspeak.v1.ChannelStatusR\x06status\"\x86\x01\n" +
"\x14CreateChannelRequest\x12\x12\n" +
"\x04name\x18\x01 \x01(\tR\x04name\x12 \n" +
"\vdescription\x18\x02 \x01(\tR\vdescription\x12\x1b\n" +
"\tis_public\x18\x03 \x01(\bR\bisPublic\x12\x1b\n" +
"\tmax_users\x18\x04 \x01(\x05R\bmaxUsers\"v\n" +
"\x15CreateChannelResponse\x12,\n" +
"\x06status\x18\x01 \x01(\v2\x14.openspeak.v1.StatusR\x06status\x12/\n" +
"\achannel\x18\x02 \x01(\v2\x15.openspeak.v1.ChannelR\achannel\"2\n" +
"\x11GetChannelRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\"\x7f\n" +
"\x13ListChannelsRequest\x12?\n" +
"\n" +
"pagination\x18\x01 \x01(\v2\x1f.openspeak.v1.PaginationRequestR\n" +
"pagination\x12'\n" +
"\x0finclude_private\x18\x02 \x01(\bR\x0eincludePrivate\"\x8b\x01\n" +
"\x14ListChannelsResponse\x121\n" +
"\bchannels\x18\x01 \x03(\v2\x15.openspeak.v1.ChannelR\bchannels\x12@\n" +
"\n" +
"pagination\x18\x02 \x01(\v2 .openspeak.v1.PaginationResponseR\n" +
"pagination\"\xa5\x01\n" +
"\x14UpdateChannelRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\x12\x12\n" +
"\x04name\x18\x02 \x01(\tR\x04name\x12 \n" +
"\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1b\n" +
"\tis_public\x18\x04 \x01(\bR\bisPublic\x12\x1b\n" +
"\tmax_users\x18\x05 \x01(\x05R\bmaxUsers\"V\n" +
"\x14DeleteChannelRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1f\n" +
"\vhard_delete\x18\x02 \x01(\bR\n" +
"hardDelete\"3\n" +
"\x12JoinChannelRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\"t\n" +
"\x13JoinChannelResponse\x12,\n" +
"\x06status\x18\x01 \x01(\v2\x14.openspeak.v1.StatusR\x06status\x12/\n" +
"\achannel\x18\x02 \x01(\v2\x15.openspeak.v1.ChannelR\achannel\"4\n" +
"\x13LeaveChannelRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\"t\n" +
"\x12ListMembersRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\x12?\n" +
"\n" +
"pagination\x18\x02 \x01(\v2\x1f.openspeak.v1.PaginationRequestR\n" +
"pagination\"v\n" +
"\x13ListMembersResponse\x12\x1d\n" +
"\n" +
"member_ids\x18\x01 \x03(\tR\tmemberIds\x12@\n" +
"\n" +
"pagination\x18\x02 \x01(\v2 .openspeak.v1.PaginationResponseR\n" +
"pagination\">\n" +
"\x1dSubscribeChannelEventsRequest\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\"\xf6\x01\n" +
"\fChannelEvent\x12\x1d\n" +
"\n" +
"channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" +
"\n" +
"event_type\x18\x02 \x01(\tR\teventType\x12\x1c\n" +
"\ttimestamp\x18\x03 \x01(\x03R\ttimestamp\x12\x17\n" +
"\auser_id\x18\x04 \x01(\tR\x06userId\x128\n" +
"\x04data\x18\x05 \x03(\v2$.openspeak.v1.ChannelEvent.DataEntryR\x04data\x1a7\n" +
"\tDataEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01*6\n" +
"\rChannelStatus\x12\n" +
"\n" +
"\x06ACTIVE\x10\x00\x12\f\n" +
"\bARCHIVED\x10\x01\x12\v\n" +
"\aDELETED\x10\x022\xf4\x05\n" +
"\x0eChannelService\x12X\n" +
"\rCreateChannel\x12\".openspeak.v1.CreateChannelRequest\x1a#.openspeak.v1.CreateChannelResponse\x12D\n" +
"\n" +
"GetChannel\x12\x1f.openspeak.v1.GetChannelRequest\x1a\x15.openspeak.v1.Channel\x12U\n" +
"\fListChannels\x12!.openspeak.v1.ListChannelsRequest\x1a\".openspeak.v1.ListChannelsResponse\x12J\n" +
"\rUpdateChannel\x12\".openspeak.v1.UpdateChannelRequest\x1a\x15.openspeak.v1.Channel\x12I\n" +
"\rDeleteChannel\x12\".openspeak.v1.DeleteChannelRequest\x1a\x14.openspeak.v1.Status\x12R\n" +
"\vJoinChannel\x12 .openspeak.v1.JoinChannelRequest\x1a!.openspeak.v1.JoinChannelResponse\x12G\n" +
"\fLeaveChannel\x12!.openspeak.v1.LeaveChannelRequest\x1a\x14.openspeak.v1.Status\x12R\n" +
"\vListMembers\x12 .openspeak.v1.ListMembersRequest\x1a!.openspeak.v1.ListMembersResponse\x12c\n" +
"\x16SubscribeChannelEvents\x12+.openspeak.v1.SubscribeChannelEventsRequest\x1a\x1a.openspeak.v1.ChannelEvent0\x01B1Z/github.com/sorti/openspeak/pkg/api/openspeak/v1b\x06proto3"
var (
file_proto_channel_proto_rawDescOnce sync.Once
file_proto_channel_proto_rawDescData []byte
)
func file_proto_channel_proto_rawDescGZIP() []byte {
file_proto_channel_proto_rawDescOnce.Do(func() {
file_proto_channel_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proto_channel_proto_rawDesc), len(file_proto_channel_proto_rawDesc)))
})
return file_proto_channel_proto_rawDescData
}
var file_proto_channel_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_proto_channel_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
var file_proto_channel_proto_goTypes = []any{
(ChannelStatus)(0), // 0: openspeak.v1.ChannelStatus
(*Channel)(nil), // 1: openspeak.v1.Channel
(*CreateChannelRequest)(nil), // 2: openspeak.v1.CreateChannelRequest
(*CreateChannelResponse)(nil), // 3: openspeak.v1.CreateChannelResponse
(*GetChannelRequest)(nil), // 4: openspeak.v1.GetChannelRequest
(*ListChannelsRequest)(nil), // 5: openspeak.v1.ListChannelsRequest
(*ListChannelsResponse)(nil), // 6: openspeak.v1.ListChannelsResponse
(*UpdateChannelRequest)(nil), // 7: openspeak.v1.UpdateChannelRequest
(*DeleteChannelRequest)(nil), // 8: openspeak.v1.DeleteChannelRequest
(*JoinChannelRequest)(nil), // 9: openspeak.v1.JoinChannelRequest
(*JoinChannelResponse)(nil), // 10: openspeak.v1.JoinChannelResponse
(*LeaveChannelRequest)(nil), // 11: openspeak.v1.LeaveChannelRequest
(*ListMembersRequest)(nil), // 12: openspeak.v1.ListMembersRequest
(*ListMembersResponse)(nil), // 13: openspeak.v1.ListMembersResponse
(*SubscribeChannelEventsRequest)(nil), // 14: openspeak.v1.SubscribeChannelEventsRequest
(*ChannelEvent)(nil), // 15: openspeak.v1.ChannelEvent
nil, // 16: openspeak.v1.ChannelEvent.DataEntry
(*Status)(nil), // 17: openspeak.v1.Status
(*PaginationRequest)(nil), // 18: openspeak.v1.PaginationRequest
(*PaginationResponse)(nil), // 19: openspeak.v1.PaginationResponse
}
var file_proto_channel_proto_depIdxs = []int32{
0, // 0: openspeak.v1.Channel.status:type_name -> openspeak.v1.ChannelStatus
17, // 1: openspeak.v1.CreateChannelResponse.status:type_name -> openspeak.v1.Status
1, // 2: openspeak.v1.CreateChannelResponse.channel:type_name -> openspeak.v1.Channel
18, // 3: openspeak.v1.ListChannelsRequest.pagination:type_name -> openspeak.v1.PaginationRequest
1, // 4: openspeak.v1.ListChannelsResponse.channels:type_name -> openspeak.v1.Channel
19, // 5: openspeak.v1.ListChannelsResponse.pagination:type_name -> openspeak.v1.PaginationResponse
17, // 6: openspeak.v1.JoinChannelResponse.status:type_name -> openspeak.v1.Status
1, // 7: openspeak.v1.JoinChannelResponse.channel:type_name -> openspeak.v1.Channel
18, // 8: openspeak.v1.ListMembersRequest.pagination:type_name -> openspeak.v1.PaginationRequest
19, // 9: openspeak.v1.ListMembersResponse.pagination:type_name -> openspeak.v1.PaginationResponse
16, // 10: openspeak.v1.ChannelEvent.data:type_name -> openspeak.v1.ChannelEvent.DataEntry
2, // 11: openspeak.v1.ChannelService.CreateChannel:input_type -> openspeak.v1.CreateChannelRequest
4, // 12: openspeak.v1.ChannelService.GetChannel:input_type -> openspeak.v1.GetChannelRequest
5, // 13: openspeak.v1.ChannelService.ListChannels:input_type -> openspeak.v1.ListChannelsRequest
7, // 14: openspeak.v1.ChannelService.UpdateChannel:input_type -> openspeak.v1.UpdateChannelRequest
8, // 15: openspeak.v1.ChannelService.DeleteChannel:input_type -> openspeak.v1.DeleteChannelRequest
9, // 16: openspeak.v1.ChannelService.JoinChannel:input_type -> openspeak.v1.JoinChannelRequest
11, // 17: openspeak.v1.ChannelService.LeaveChannel:input_type -> openspeak.v1.LeaveChannelRequest
12, // 18: openspeak.v1.ChannelService.ListMembers:input_type -> openspeak.v1.ListMembersRequest
14, // 19: openspeak.v1.ChannelService.SubscribeChannelEvents:input_type -> openspeak.v1.SubscribeChannelEventsRequest
3, // 20: openspeak.v1.ChannelService.CreateChannel:output_type -> openspeak.v1.CreateChannelResponse
1, // 21: openspeak.v1.ChannelService.GetChannel:output_type -> openspeak.v1.Channel
6, // 22: openspeak.v1.ChannelService.ListChannels:output_type -> openspeak.v1.ListChannelsResponse
1, // 23: openspeak.v1.ChannelService.UpdateChannel:output_type -> openspeak.v1.Channel
17, // 24: openspeak.v1.ChannelService.DeleteChannel:output_type -> openspeak.v1.Status
10, // 25: openspeak.v1.ChannelService.JoinChannel:output_type -> openspeak.v1.JoinChannelResponse
17, // 26: openspeak.v1.ChannelService.LeaveChannel:output_type -> openspeak.v1.Status
13, // 27: openspeak.v1.ChannelService.ListMembers:output_type -> openspeak.v1.ListMembersResponse
15, // 28: openspeak.v1.ChannelService.SubscribeChannelEvents:output_type -> openspeak.v1.ChannelEvent
20, // [20:29] is the sub-list for method output_type
11, // [11:20] is the sub-list for method input_type
11, // [11:11] is the sub-list for extension type_name
11, // [11:11] is the sub-list for extension extendee
0, // [0:11] is the sub-list for field type_name
}
func init() { file_proto_channel_proto_init() }
func file_proto_channel_proto_init() {
if File_proto_channel_proto != nil {
return
}
file_proto_common_proto_init()
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_channel_proto_rawDesc), len(file_proto_channel_proto_rawDesc)),
NumEnums: 1,
NumMessages: 16,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_proto_channel_proto_goTypes,
DependencyIndexes: file_proto_channel_proto_depIdxs,
EnumInfos: file_proto_channel_proto_enumTypes,
MessageInfos: file_proto_channel_proto_msgTypes,
}.Build()
File_proto_channel_proto = out.File
file_proto_channel_proto_goTypes = nil
file_proto_channel_proto_depIdxs = nil
}