messaging

package
v1.22.88 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 19, 2026 License: BSD-3-Clause Imports: 8 Imported by: 0

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

Constants

This section is empty.

Variables

View Source
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

func (*MessageStore) UpdateReadMarker

func (s *MessageStore) UpdateReadMarker(ctx context.Context, conversationID ids.ID, accountID [32]byte, lastReadID ids.ID) error

UpdateReadMarker updates a read marker for an account

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

func (*ReadMarkerCRDT) Update

func (r *ReadMarkerCRDT) Update(accountID [32]byte, lastReadID ids.ID, lastReadTime time.Time)

Update updates a read marker (LWW semantics)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL