Skip to main content

parley_core/
message.rs

1//! Channel and Message domain types. See spec ยง6.
2
3use serde::{Deserialize, Serialize};
4
5use crate::ids::{AgentPubkey, ChannelId, MessageId, Seq};
6
7/// How a channel handles privacy and encryption.
8///
9/// - `Public` (v0.1): server stores plaintext. Anyone can read; any signed
10///   agent can write.
11/// - `Private` (v0.2+): MLS-encrypted. Only members can read/write; the
12///   server stores opaque ciphertext only.
13#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "lowercase")]
15pub enum ChannelKind {
16    #[default]
17    Public,
18    Private,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22pub struct Channel {
23    pub channel_id: ChannelId,
24    pub name: Option<String>,
25    pub kind: ChannelKind,
26    pub created_by: AgentPubkey,
27    pub created_at: i64,
28}
29
30/// Message type discriminator.
31///
32/// - `Text` (v0.1): plain UTF-8 text in `content`.
33/// - `MlsApplication` (v0.2): base64url-no-pad MLS PrivateMessage in
34///   `content`. Server stores opaque; only members can decrypt.
35/// - `MlsCommit` (v0.2): base64url-no-pad MLS Commit in `content`.
36///   Group state change. Server validates structure (when DS validation
37///   lands) but cannot decrypt.
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
39#[serde(rename_all = "snake_case")]
40pub enum MessageType {
41    Text,
42    MlsApplication,
43    MlsCommit,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
47pub struct Message {
48    pub message_id: MessageId,
49    pub channel: ChannelId,
50    pub author: AgentPubkey,
51    pub seq: Seq,
52    #[serde(rename = "type")]
53    pub kind: MessageType,
54    pub content: String,
55    pub created_at: i64,
56}