openrtc 1.0.1

OpenRTC: a Rust-first P2P runtime for device discovery, signaling, and iroh/QUIC networking.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct FirestoreValue {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub string_value: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub integer_value: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub boolean_value: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub timestamp_value: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub map_value: Option<MapValue>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub array_value: Option<ArrayValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct ArrayValue {
    #[serde(default)]
    pub values: Vec<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct MapValue {
    pub fields: std::collections::HashMap<String, FirestoreValue>,
}

pub fn str_val(s: &str) -> FirestoreValue {
    FirestoreValue {
        string_value: Some(s.to_string()),
        integer_value: None,
        boolean_value: None,
        timestamp_value: None,
        map_value: None,
        array_value: None,
    }
}

pub fn bool_val(b: bool) -> FirestoreValue {
    FirestoreValue {
        string_value: None,
        integer_value: None,
        boolean_value: Some(b),
        timestamp_value: None,
        map_value: None,
        array_value: None,
    }
}

pub fn ts_val(ts: &str) -> FirestoreValue {
    FirestoreValue {
        string_value: None,
        integer_value: None,
        boolean_value: None,
        timestamp_value: Some(ts.to_string()),
        map_value: None,
        array_value: None,
    }
}

pub fn int_val(i: i64) -> FirestoreValue {
    FirestoreValue {
        string_value: None,
        integer_value: Some(i.to_string()),
        boolean_value: None,
        timestamp_value: None,
        map_value: None,
        array_value: None,
    }
}

pub fn map_val(fields: std::collections::HashMap<String, FirestoreValue>) -> FirestoreValue {
    FirestoreValue {
        string_value: None,
        integer_value: None,
        boolean_value: None,
        timestamp_value: None,
        map_value: Some(MapValue { fields }),
        array_value: None,
    }
}

pub fn str_array_val(items: &[String]) -> FirestoreValue {
    FirestoreValue {
        string_value: None,
        integer_value: None,
        boolean_value: None,
        timestamp_value: None,
        map_value: None,
        array_value: Some(ArrayValue {
            values: items.iter().map(|s| str_val(s)).collect(),
        }),
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FirestoreDocument<T> {
    pub name: String,
    pub fields: T,
    #[serde(rename = "createTime")]
    pub create_time: Option<String>,
    #[serde(rename = "updateTime")]
    pub update_time: Option<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct DeviceFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "userId", skip_serializing_if = "Option::is_none")]
    pub user_id: Option<FirestoreValue>,
    #[serde(rename = "deviceId", skip_serializing_if = "Option::is_none")]
    pub device_id: Option<FirestoreValue>,
    #[serde(rename = "deviceName", skip_serializing_if = "Option::is_none")]
    pub device_name: Option<FirestoreValue>,
    #[serde(rename = "nodeId", skip_serializing_if = "Option::is_none")]
    pub node_id: Option<FirestoreValue>,
    #[serde(rename = "platformType", skip_serializing_if = "Option::is_none")]
    pub platform_type: Option<FirestoreValue>,
    #[serde(rename = "sessionId", skip_serializing_if = "Option::is_none")]
    pub session_id: Option<FirestoreValue>,
    #[serde(rename = "tag", skip_serializing_if = "Option::is_none")]
    pub tag: Option<FirestoreValue>,
    #[serde(rename = "kind", skip_serializing_if = "Option::is_none")]
    pub kind: Option<FirestoreValue>,
    #[serde(rename = "capabilities", skip_serializing_if = "Option::is_none")]
    pub capabilities: Option<FirestoreValue>,
    #[serde(rename = "metadata", skip_serializing_if = "Option::is_none")]
    pub metadata: Option<FirestoreValue>,
    #[serde(rename = "online", skip_serializing_if = "Option::is_none")]
    pub online: Option<FirestoreValue>,
    #[serde(rename = "ticket", skip_serializing_if = "Option::is_none")]
    pub ticket: Option<FirestoreValue>,
    #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")]
    pub last_seen_at: Option<FirestoreValue>,
    #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")]
    pub created_at: Option<FirestoreValue>,
    #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")]
    pub updated_at: Option<FirestoreValue>,
    #[serde(rename = "lastSeen", skip_serializing_if = "Option::is_none")]
    pub last_seen: Option<FirestoreValue>,
    #[serde(rename = "expiresAt", skip_serializing_if = "Option::is_none")]
    pub expires_at: Option<FirestoreValue>,
    #[serde(rename = "excludedPeers", skip_serializing_if = "Option::is_none")]
    pub excluded_peers: Option<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct RoomMemberFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "nodeId", skip_serializing_if = "Option::is_none")]
    pub node_id: Option<FirestoreValue>,
    #[serde(rename = "userId", skip_serializing_if = "Option::is_none")]
    pub user_id: Option<FirestoreValue>,
    #[serde(rename = "ticket", skip_serializing_if = "Option::is_none")]
    pub ticket: Option<FirestoreValue>,
    #[serde(rename = "joinedAt", skip_serializing_if = "Option::is_none")]
    pub joined_at: Option<FirestoreValue>,
    #[serde(rename = "lastSeenAt", skip_serializing_if = "Option::is_none")]
    pub last_seen_at: Option<FirestoreValue>,
    #[serde(rename = "expiresAt", skip_serializing_if = "Option::is_none")]
    pub expires_at: Option<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct RoomDocFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "hostId", skip_serializing_if = "Option::is_none")]
    pub host_id: Option<FirestoreValue>,
    #[serde(rename = "memberCount", skip_serializing_if = "Option::is_none")]
    pub member_count: Option<FirestoreValue>,
    #[serde(rename = "maxMembers", skip_serializing_if = "Option::is_none")]
    pub max_members: Option<FirestoreValue>,
    #[serde(rename = "status", skip_serializing_if = "Option::is_none")]
    pub status: Option<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct RoomAccessFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "roomId", skip_serializing_if = "Option::is_none")]
    pub room_id: Option<FirestoreValue>,
    #[serde(rename = "userId", skip_serializing_if = "Option::is_none")]
    pub user_id: Option<FirestoreValue>,
    #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")]
    pub created_at: Option<FirestoreValue>,
    #[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")]
    pub updated_at: Option<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct SignalingEnvelopeFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "senderId", skip_serializing_if = "Option::is_none")]
    pub sender_id: Option<FirestoreValue>,
    #[serde(rename = "targetId", skip_serializing_if = "Option::is_none")]
    pub target_id: Option<FirestoreValue>,
    #[serde(rename = "payload", skip_serializing_if = "Option::is_none")]
    pub payload: Option<FirestoreValue>,
    #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
    pub state: Option<FirestoreValue>,
    #[serde(rename = "replyPayload", skip_serializing_if = "Option::is_none")]
    pub reply_payload: Option<FirestoreValue>,
    #[serde(rename = "timestamp", skip_serializing_if = "Option::is_none")]
    pub timestamp: Option<FirestoreValue>,
    #[serde(rename = "senderUserId", skip_serializing_if = "Option::is_none")]
    pub sender_user_id: Option<FirestoreValue>,
    #[serde(rename = "targetUserId", skip_serializing_if = "Option::is_none")]
    pub target_user_id: Option<FirestoreValue>,
    #[serde(rename = "expiresAt", skip_serializing_if = "Option::is_none")]
    pub expires_at: Option<FirestoreValue>,
}

/// Top-level fields of `developer_apps/{apiKey}` — written by Firebase Functions,
/// read by the native SDK at startup to populate `Client.app_limits`.
#[derive(Serialize, Deserialize, Debug)]
pub struct DeveloperAppFields {
    #[serde(rename = "limits", skip_serializing_if = "Option::is_none")]
    pub limits: Option<FirestoreValue>, // map_value containing limit integers
    #[serde(rename = "plan", skip_serializing_if = "Option::is_none")]
    pub plan: Option<FirestoreValue>,
    #[serde(rename = "status", skip_serializing_if = "Option::is_none")]
    pub status: Option<FirestoreValue>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct SignalingSessionFields {
    #[serde(rename = "appTag", skip_serializing_if = "Option::is_none")]
    pub app_tag: Option<FirestoreValue>,
    #[serde(rename = "connectionId", skip_serializing_if = "Option::is_none")]
    pub connection_id: Option<FirestoreValue>,
    #[serde(rename = "initiatorDeviceId", skip_serializing_if = "Option::is_none")]
    pub initiator_device_id: Option<FirestoreValue>,
    #[serde(rename = "targetDeviceId", skip_serializing_if = "Option::is_none")]
    pub target_device_id: Option<FirestoreValue>,
    #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
    pub state: Option<FirestoreValue>,
    #[serde(rename = "offer", skip_serializing_if = "Option::is_none")]
    pub offer: Option<FirestoreValue>,
    #[serde(rename = "answer", skip_serializing_if = "Option::is_none")]
    pub answer: Option<FirestoreValue>,
    #[serde(rename = "createdAt", skip_serializing_if = "Option::is_none")]
    pub created_at: Option<FirestoreValue>,
}