iris_chat_protocol/
lib.rs1mod protocol_engine;
2mod storage;
3
4use nostr::{Alphabet, SingleLetterTag, UnsignedEvent};
5use nostr::{Event, Filter, Keys, Kind, PublicKey, Timestamp};
6use nostr_double_ratchet::{
7 sender_key_repair_default_next_retry_at, AuthorizedDevice, DevicePubkey as NdrDevicePubkey,
8 DeviceRoster, DomainError, Error as NdrError, GroupIncomingEvent, GroupManagerSnapshot,
9 GroupPendingFanout, GroupPreparedPublish, GroupPreparedSend, GroupProtocol,
10 GroupSenderKeyHandleResult, GroupSenderKeyMessage, GroupSnapshot, Invite, MessageEnvelope,
11 OwnerPubkey as NdrOwnerPubkey, PreparedSend, ProtocolContext, RelayGap, SenderKeyRepairRequest,
12 SessionManager, SessionManagerSnapshot, SessionState, UnixSeconds as NdrUnixSeconds,
13};
14use nostr_double_ratchet_nostr::{
15 group_sender_key_message_event, invite_response_event, message_event,
16 parse_group_sender_key_message_event, parse_group_sender_key_message_event_unchecked,
17 parse_invite_event, parse_invite_response_event, parse_message_event, NostrGroupManager,
18};
19use nostr_double_ratchet_pairwise_codec as pairwise_codec;
20use rand::rngs::OsRng;
21use serde::{Deserialize, Serialize};
22use std::collections::{BTreeMap, HashSet};
23use std::sync::{Arc, Mutex};
24use std::time::{SystemTime, UNIX_EPOCH};
25
26pub use nostr_double_ratchet_nostr::{
27 is_app_keys_event, AppKeys, APP_KEYS_EVENT_KIND, CHAT_MESSAGE_KIND, CHAT_SETTINGS_KIND,
28 GROUP_SENDER_KEY_MESSAGE_KIND, INVITE_EVENT_KIND, INVITE_RESPONSE_KIND, MESSAGE_EVENT_KIND,
29 REACTION_KIND, RECEIPT_KIND,
30};
31pub use nostr_double_ratchet_runtime::StorageAdapter;
32pub use protocol_engine::*;
33pub use storage::SqliteStorageAdapter;
34
35const DEVICE_INVITE_DISCOVERY_LOOKBACK_SECS: u64 = 30 * 24 * 60 * 60;
36const DEVICE_INVITE_DISCOVERY_LIMIT: usize = 256;
37const NDR_APP_KEYS_D_TAG: &str = "double-ratchet/app-keys";
38const NDR_INVITES_L_TAG: &str = "double-ratchet/invites";
39
40pub type SharedConnection = Arc<Mutex<rusqlite::Connection>>;
41
42#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
43pub struct UnixSeconds(pub u64);
44
45impl UnixSeconds {
46 pub fn get(self) -> u64 {
47 self.0
48 }
49}
50
51fn unix_now() -> UnixSeconds {
52 UnixSeconds(
53 SystemTime::now()
54 .duration_since(UNIX_EPOCH)
55 .unwrap_or_default()
56 .as_secs(),
57 )
58}