Documentation
¶
Index ¶
- Variables
- func CompareVersions(a, b string) int
- func DecryptMessage(sessionKey *SessionKey, encrypted *EncryptedMessage) ([]byte, error)
- func GetServerVersionInfo() string
- func GetVersionInfo() string
- type EncryptedMessage
- type FileMeta
- type Handshake
- type Message
- type MessageType
- type ReactionMeta
- type SessionKey
Constants ¶
This section is empty.
Variables ¶
var ( // ClientVersion is the version of the MarChat client ClientVersion = "dev" // ServerVersion is the version of the MarChat server ServerVersion = "dev" // BuildTime is the time when the binary was built BuildTime = "unknown" // GitCommit is the git commit hash GitCommit = "unknown" )
Version variables that can be set at build time using ldflags
Functions ¶
func CompareVersions ¶
CompareVersions compares two semver-style version strings (e.g. "1.2.3"). Returns -1 if a < b, 0 if a == b, 1 if a > b. Non-numeric or "dev" versions are treated as 0.0.0 so they satisfy any constraint.
func DecryptMessage ¶
func DecryptMessage(sessionKey *SessionKey, encrypted *EncryptedMessage) ([]byte, error)
DecryptMessage decrypts a message using ChaCha20-Poly1305.
func GetServerVersionInfo ¶
func GetServerVersionInfo() string
GetServerVersionInfo returns a formatted server version string
func GetVersionInfo ¶
func GetVersionInfo() string
GetVersionInfo returns a formatted version string
Types ¶
type EncryptedMessage ¶
type EncryptedMessage struct {
Type MessageType `json:"type"`
Sender string `json:"sender"`
CreatedAt time.Time `json:"created_at"`
Content string `json:"content,omitempty"` // Plaintext for system messages
Encrypted []byte `json:"encrypted,omitempty"` // Encrypted payload
Nonce []byte `json:"nonce,omitempty"` // For encrypted messages
Recipient string `json:"recipient,omitempty"` // For direct messages
IsEncrypted bool `json:"is_encrypted,omitempty"` // Flag for encrypted messages
File *FileMeta `json:"file,omitempty"` // For file messages
}
EncryptedMessage represents an E2E encrypted message (AEAD payload and metadata).
func EncryptMessage ¶
func EncryptMessage(sessionKey *SessionKey, plaintext []byte) (*EncryptedMessage, error)
EncryptMessage encrypts a message using ChaCha20-Poly1305.
func EncryptTextMessage ¶
func EncryptTextMessage(sessionKey *SessionKey, sender, content string) (*EncryptedMessage, error)
EncryptTextMessage encrypts a text message.
type Handshake ¶
type Handshake struct {
Username string `json:"username"`
Admin bool `json:"admin"`
AdminKey string `json:"admin_key,omitempty"`
}
Handshake is sent by the client on WebSocket connect for authentication
type Message ¶
type Message struct {
Sender string `json:"sender"`
Content string `json:"content"`
CreatedAt time.Time `json:"created_at"`
Type MessageType `json:"type,omitempty"`
Encrypted bool `json:"encrypted,omitempty"`
// MessageID uniquely identifies a message for edits, deletes, reactions, pins
MessageID int64 `json:"message_id,omitempty"`
// Recipient for direct messages (empty = broadcast to all)
Recipient string `json:"recipient,omitempty"`
// Edited indicates the message has been modified
Edited bool `json:"edited,omitempty"`
Channel string `json:"channel,omitempty"`
// Reaction metadata
Reaction *ReactionMeta `json:"reaction,omitempty"`
// For file messages, Content is empty and File is set
File *FileMeta `json:"file,omitempty"`
}
func DecryptTextMessage ¶
func DecryptTextMessage(sessionKey *SessionKey, encrypted *EncryptedMessage) (*Message, error)
DecryptTextMessage decrypts a text message and returns the original Message.
type MessageType ¶
type MessageType string
MessageType distinguishes between text and file messages
const ( TextMessage MessageType = "text" FileMessageType MessageType = "file" AdminCommandType MessageType = "admin_command" EditMessageType MessageType = "edit" DeleteMessage MessageType = "delete" TypingMessage MessageType = "typing" ReactionMessage MessageType = "reaction" DirectMessage MessageType = "dm" SearchMessage MessageType = "search" PinMessage MessageType = "pin" ReadReceiptType MessageType = "read_receipt" JoinChannelType MessageType = "join_channel" LeaveChannelType MessageType = "leave_channel" ListChannelsType MessageType = "list_channels" )
type ReactionMeta ¶
type ReactionMeta struct {
Emoji string `json:"emoji"`
TargetID int64 `json:"target_id"`
IsRemoval bool `json:"is_removal,omitempty"`
}
ReactionMeta contains reaction data for a message
type SessionKey ¶
type SessionKey struct {
Key []byte `json:"key"`
CreatedAt time.Time `json:"created_at"`
KeyID string `json:"key_id"`
}
SessionKey holds 32-byte ChaCha20-Poly1305 key material for the global E2E model. KeyID is a base64(SHA256(key)) fingerprint for logs and display, not a wire identifier.