enigma-node-types 0.0.1

Canonical node-facing types and strict codecs for Enigma (UserId hashing, identities, presence, relay envelopes).
Documentation
use base64::engine::general_purpose::STANDARD;
use base64::Engine;
use uuid::Uuid;

use crate::node::NodeInfo;
use crate::relay::{OpaqueMessage, OpaqueSignaling, RelayEnvelope, RelayKind};
use crate::user_id::UserId;

#[test]
fn invalid_base64_rejected() {
    let user_id = UserId::from_username("kate").expect("user id");
    let envelope = RelayEnvelope {
        id: Uuid::new_v4(),
        to: user_id,
        from: None,
        created_at_ms: 1,
        expires_at_ms: Some(2),
        kind: RelayKind::OpaqueMessage(OpaqueMessage {
            blob_b64: "%not-base64%".to_string(),
            content_type: None,
        }),
    };
    assert!(envelope.validate().is_err());
}

#[test]
fn expires_at_not_after_created_rejected() {
    let user_id = UserId::from_username("leo").expect("user id");
    let envelope = RelayEnvelope {
        id: Uuid::new_v4(),
        to: user_id,
        from: None,
        created_at_ms: 10,
        expires_at_ms: Some(5),
        kind: RelayKind::OpaqueSignaling(OpaqueSignaling {
            blob_b64: STANDARD.encode("data"),
        }),
    };
    assert!(envelope.validate().is_err());
}

#[test]
fn base_url_without_scheme_rejected() {
    let node = NodeInfo {
        base_url: "node.example.com".to_string(),
    };
    assert!(node.validate().is_err());
}