Documentation
¶
Overview ¶
Package messaging provides FHE-CRDT extensions for private messaging. It enables encrypted CRDTs for conversation metadata, group membership, read markers, and rate-limit counters integrated with service node storage.
Index ¶
- Variables
- func SerializeConversation(conv *Conversation) ([]byte, error)
- type Conversation
- type ConversationType
- type Encryptor
- type MemberEntry
- type MembershipCRDT
- func (m *MembershipCRDT) Add(accountID [32]byte, role string, addedBy [32]byte) string
- func (m *MembershipCRDT) GetMember(accountID [32]byte) (*MemberEntry, string, error)
- func (m *MembershipCRDT) GetMembers() []*MemberEntry
- func (m *MembershipCRDT) IsMember(accountID [32]byte) bool
- func (m *MembershipCRDT) Merge(other *MembershipCRDT)
- func (m *MembershipCRDT) Remove(tag string)
- type MessageStore
- func (s *MessageStore) AddMember(ctx context.Context, conversationID ids.ID, accountID [32]byte, role string, ...) error
- func (s *MessageStore) CheckRateLimit(accountID [32]byte) error
- func (s *MessageStore) CreateConversation(ctx context.Context, convType ConversationType, creatorID [32]byte, ...) (*Conversation, error)
- func (s *MessageStore) GetConversation(conversationID ids.ID) (*Conversation, error)
- func (s *MessageStore) IncrementRateLimit(accountID [32]byte)
- func (s *MessageStore) RemoveMember(ctx context.Context, conversationID ids.ID, accountID [32]byte, ...) error
- func (s *MessageStore) UpdateReadMarker(ctx context.Context, conversationID ids.ID, accountID [32]byte, ...) error
- type RateCounter
- type RateLimiter
- type ReadMarker
- type ReadMarkerCRDT
Constants ¶
This section is empty.
Variables ¶
var ( ErrConversationNotFound = errors.New("conversation not found") ErrMemberNotFound = errors.New("member not found") ErrRateLimitExceeded = errors.New("rate limit exceeded") ErrEncryptionFailed = errors.New("encryption failed") ErrDecryptionFailed = errors.New("decryption failed") ErrInvalidSignature = errors.New("invalid signature") ErrNotMember = errors.New("not a member of this conversation") )
Errors
Functions ¶
func SerializeConversation ¶
func SerializeConversation(conv *Conversation) ([]byte, error)
SerializeConversation serializes a conversation to JSON
Types ¶
type Conversation ¶
type Conversation struct {
ID ids.ID `json:"id"`
Type ConversationType `json:"type"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
// Encrypted metadata
EncryptedName []byte `json:"encryptedName,omitempty"`
EncryptedDescription []byte `json:"encryptedDescription,omitempty"`
EncryptedAvatar []byte `json:"encryptedAvatar,omitempty"`
// CRDT state
MembersCRDT *MembershipCRDT `json:"membersCrdt"`
ReadMarkersCRDT *ReadMarkerCRDT `json:"readMarkersCrdt"`
// Key management
KeyRotationEpoch uint64 `json:"keyRotationEpoch"`
EncryptedKeys [][]byte `json:"encryptedKeys"` // Per-member encrypted session key
// Settings
DisappearingMessages bool `json:"disappearingMessages"`
MessageTTL int64 `json:"messageTtl"` // Seconds
// Version for optimistic concurrency
Version [32]byte `json:"version"`
}
Conversation represents an encrypted conversation with CRDT metadata
func DeserializeConversation ¶
func DeserializeConversation(data []byte) (*Conversation, error)
DeserializeConversation deserializes a conversation from JSON
func MergeConversations ¶
func MergeConversations(local, remote *Conversation) *Conversation
MergeConversations merges two conversation states
func (*Conversation) Hash ¶
func (c *Conversation) Hash() [32]byte
Hash returns the hash of the conversation
type ConversationType ¶
type ConversationType uint8
ConversationType defines the type of conversation
const ( ConversationDirect ConversationType = iota ConversationGroup ConversationBroadcast )
type Encryptor ¶
type Encryptor interface {
// Encrypt encrypts data for the given recipients
Encrypt(ctx context.Context, data []byte, recipients [][32]byte) ([]byte, error)
// Decrypt decrypts data using the given private key
Decrypt(ctx context.Context, ciphertext []byte, privateKey []byte) ([]byte, error)
// DeriveConversationKey derives a shared key for a conversation
DeriveConversationKey(conversationID ids.ID, members [][32]byte) ([]byte, error)
}
Encryptor provides encryption/decryption operations
type MemberEntry ¶
type MemberEntry struct {
AccountID [32]byte `json:"accountId"`
Role string `json:"role"` // "admin", "member", "viewer"
AddedAt time.Time `json:"addedAt"`
AddedBy [32]byte `json:"addedBy"`
// Encrypted member-specific data
EncryptedNickname []byte `json:"encryptedNickname,omitempty"`
}
MemberEntry represents a member in the membership CRDT
type MembershipCRDT ¶
type MembershipCRDT struct {
Added map[string]*MemberEntry `json:"added"` // uniqueTag -> MemberEntry
Removed map[string]time.Time `json:"removed"` // uniqueTag -> removal time
// contains filtered or unexported fields
}
MembershipCRDT tracks group membership using an OR-Set CRDT
func NewMembershipCRDT ¶
func NewMembershipCRDT() *MembershipCRDT
NewMembershipCRDT creates a new membership CRDT
func (*MembershipCRDT) Add ¶
func (m *MembershipCRDT) Add(accountID [32]byte, role string, addedBy [32]byte) string
Add adds a member to the conversation
func (*MembershipCRDT) GetMember ¶
func (m *MembershipCRDT) GetMember(accountID [32]byte) (*MemberEntry, string, error)
GetMember returns a member entry by account ID
func (*MembershipCRDT) GetMembers ¶
func (m *MembershipCRDT) GetMembers() []*MemberEntry
GetMembers returns all active members
func (*MembershipCRDT) IsMember ¶
func (m *MembershipCRDT) IsMember(accountID [32]byte) bool
IsMember checks if an account is a member
func (*MembershipCRDT) Merge ¶
func (m *MembershipCRDT) Merge(other *MembershipCRDT)
Merge merges another membership CRDT into this one
func (*MembershipCRDT) Remove ¶
func (m *MembershipCRDT) Remove(tag string)
Remove removes a member from the conversation
type MessageStore ¶
type MessageStore struct {
// contains filtered or unexported fields
}
MessageStore manages encrypted messages with CRDT semantics
func NewMessageStore ¶
func NewMessageStore(encryptor Encryptor) *MessageStore
NewMessageStore creates a new message store
func (*MessageStore) AddMember ¶
func (s *MessageStore) AddMember(ctx context.Context, conversationID ids.ID, accountID [32]byte, role string, addedBy [32]byte) error
AddMember adds a member to a conversation
func (*MessageStore) CheckRateLimit ¶
func (s *MessageStore) CheckRateLimit(accountID [32]byte) error
CheckRateLimit checks if an account can send a message
func (*MessageStore) CreateConversation ¶
func (s *MessageStore) CreateConversation(ctx context.Context, convType ConversationType, creatorID [32]byte, members [][32]byte) (*Conversation, error)
CreateConversation creates a new conversation
func (*MessageStore) GetConversation ¶
func (s *MessageStore) GetConversation(conversationID ids.ID) (*Conversation, error)
GetConversation retrieves a conversation by ID
func (*MessageStore) IncrementRateLimit ¶
func (s *MessageStore) IncrementRateLimit(accountID [32]byte)
IncrementRateLimit increments the rate limit counters
func (*MessageStore) RemoveMember ¶
func (s *MessageStore) RemoveMember(ctx context.Context, conversationID ids.ID, accountID [32]byte, removedBy [32]byte) error
RemoveMember removes a member from a conversation
type RateCounter ¶
type RateCounter struct {
AccountID [32]byte
MinuteCount int
HourCount int
DayCount int
MinuteReset time.Time
HourReset time.Time
DayReset time.Time
}
RateCounter tracks message counts for an account
type RateLimiter ¶
type RateLimiter struct {
// contains filtered or unexported fields
}
RateLimiter provides rate limiting for message sending
func NewRateLimiter ¶
func NewRateLimiter(maxPerMinute, maxPerHour, maxPerDay int) *RateLimiter
NewRateLimiter creates a new rate limiter
func (*RateLimiter) Check ¶
func (r *RateLimiter) Check(accountID [32]byte) error
Check checks if an account can send a message
func (*RateLimiter) Increment ¶
func (r *RateLimiter) Increment(accountID [32]byte)
Increment increments the counters for an account
type ReadMarker ¶
type ReadMarker struct {
AccountID [32]byte `json:"accountId"`
LastReadID ids.ID `json:"lastReadId"`
LastReadTime time.Time `json:"lastReadTime"`
UpdatedAt time.Time `json:"updatedAt"`
}
ReadMarker represents a member's read position
type ReadMarkerCRDT ¶
type ReadMarkerCRDT struct {
Markers map[string]*ReadMarker `json:"markers"` // accountID hex -> ReadMarker
// contains filtered or unexported fields
}
ReadMarkerCRDT tracks read markers using LWW registers
func NewReadMarkerCRDT ¶
func NewReadMarkerCRDT() *ReadMarkerCRDT
NewReadMarkerCRDT creates a new read marker CRDT
func (*ReadMarkerCRDT) Get ¶
func (r *ReadMarkerCRDT) Get(accountID [32]byte) *ReadMarker
Get returns a read marker for an account
func (*ReadMarkerCRDT) Merge ¶
func (r *ReadMarkerCRDT) Merge(other *ReadMarkerCRDT)
Merge merges another read marker CRDT into this one