mainsail 0.1.0

Batteries-included ActivityPub Library
Documentation
use std::sync::LazyLock;
use crate::activitypub::objects::actor::{Actor, ActorType, PublicKey};
use crate::activitypub::BASIC_CONTEXT;
use crate::activitypub::objects::note::{Note, NoteType};
use crate::activitypub::signature::generate_pkey;

pub static EXT_ACTOR_1: LazyLock<Actor> = LazyLock::new(|| {
    new_test_actor("https://example.com/users/test_actor_1", "Test Actor", "@test")
});

pub static EXT_ACTOR_2: LazyLock<Actor> = LazyLock::new(|| {
    new_test_actor("https://example.com/users/test_actor_2", "Test Actor 2", "@test2")
});

pub static EXT_NOTE_1: LazyLock<Note> = LazyLock::new(|| {
    new_test_note("https://example.com/statuses/1", &EXT_ACTOR_1.id, "Test content")
});

pub fn new_test_actor(id: &str, name: &str, handle: &str) -> Actor {
    let pkey = generate_pkey().unwrap();
    let public_key_pem = pkey.public_key_to_pem().unwrap();
    let public_key = PublicKey {
        id: format!("{id}#main-key"),
        owner: id.to_string(),
        public_key_pem: String::from_utf8(public_key_pem).unwrap(),
    };

    Actor {
        context: BASIC_CONTEXT,
        id: id.to_string(),
        name: Some(name.to_string()),
        actor_type: ActorType::Person,
        url: id.to_string(),
        preferred_username: format!("@{handle}"),
        inbox: format!("{id}/inbox"),
        outbox: format!("{id}/outbox"),
        followers: Some(format!("{id}/followers")),
        following: Some(format!("{id}/following")),
        summary: Some("".to_string()),
        public_key,
        icon: None,
    }
}

pub fn new_test_note(url: &str, actor_id: &str, content: &str) -> Note {
    Note {
        id: url.to_string(),
        _type: NoteType::Note,
        url: url.to_string(),
        summary: None,
        published: None,
        in_reply_to: None,
        attributed_to: actor_id.to_string(),
        to: vec![],
        cc: vec![],
        sensitive: false,
        content: content.to_string(),
        attachment: vec![],
        tag: vec![],
    }
}

pub const PRIVATE_KEY_STR: &str = "
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDbq3Z0Q5hI09Fg
OFRnhSxVl5lKnUjDNhGkTyl0MheuepHtbp7IPx2M6c8neJoNiU+RT2eJZqRF9i2u
DWWgQ47dOPgW2+EVc/wWe2aZ2KnoVP0Zdlx8no9i6AgPem1FKAcomjetpMyY0KTY
qQgqLCdTL6efxms8Q2aAswZaHWSu6BKXQAXKXEa3zNRqTKazSzcmOZzn9JiKQQ97
26LC3/62H+CuO9OfbH27VHvFCljIm6HS6YPt5X6IvYPsRpB1mWs2L5DbUcHX95Sy
nuUsdVuil/ZqcrX/6vsYLVQAlrvtYka7GGzMELwwzjlt8/rQPLrUaviDOUpS6osc
T2uh7Yw5AgMBAAECggEAHuX+Um+TmGLa/OrPdy7fQ+bVXrkYRq/F9CkCZAq2aV9q
Q/h0XdGq6WrrLYUkPiqF8Pg3UGIJ/KFFCZ9uyl0rrOhaKnT2iHBOZtHSu78jHxVH
80XtJRufKu1c/OMJQwSqBRxeyo5Mt7iusfRiEUnb+jJ7edjiCpGnIGE4z9d56wli
K8wsCcwCMMKeMoTr+VhWaLKT+z92TGp8YzIMEzjIpswugw6e5dHY7mMO9dGaTKpf
oUaYLrJA3KivdV09ALD9C6uZVPll+BcSzHjndHLrw+vppN0aUcTtMqZjBwjfYH6j
0XDKcBxUrIxk1KZ2Z+gsMGSExbuc0J+0e5A4AReLZQKBgQD9KUugC7WruH/4jbBK
rRf3UGph6EZOIDk9vz3CEwZv0Mxpdvw9wgj6VD+iAEH4H2HzY1CZjOGrSl58JNd9
gpEZqDG+0BC2SCpmGr8n1UN4lChPqJMP9rVamvb/ZLG4M14y/R/DhPt/uGa1RQbh
A6mYOvp3fuokGXeYXb8VZG9jXwKBgQDeIgd4o5Kxtf2jqyEXBmeKDAJUCyWnFqsz
NjG4vGDcXCvDcJwcCnL/bfgIkzb+k5naP9gLU1SThX7TGxZ5o2U/Lg2tcdjCIa4X
UyGRS6/1zldH3vKHEN4MU072fc/4rqOCcXuowxOVz+rXxGDwtOhCU10M9LW4IBbS
CEHU6/YPZwKBgQDGOjORGhoiX9E0Wh2UG30Mldb22t1SB0FK7Bf7gtIjc6bbXeOc
p/ZHrPg2bWU6V7hmz3kpAnshmJXrNx3UlQvwvxZUhq7PTCqG0KKlGgQ+wiPeW+zr
Lw5J59VHnRzbUr2Lx0+71MDo/QbPIUGFp0yAeo3sS2Ai7B4NHDqnEYF2mQKBgQCA
E4jRQycCthcfdj0nBHdQfiodgSvdklF1vqqehGcoxzAoiNZJyLCTnDll4FPWJw6P
az5LEWnzgQYl/DlSOybWbdxPBBRhon+5TSJOnyA+jxF+DAs0W0JcQvCFaPcvwKng
PUR6grfZKj+S1tS6FOTR0TUWkkXwevgNc9tZRA/kwwKBgQDEnM3YyHJpbPr7DSt6
M7pBzBXSB2tq/KSJygpWyjwDz3YGrLtRkRGf70zHYRLEC34ltLchmJmIkHKIoxRB
d6RwVoXndGSsIwxJL9Ab506aRnHiN/jZPCqifgaIdOr9uVZFjNuDPMn/WOwHdKsd
3Lp7bQySBUIoNrgDvbI3uR0fjA==
-----END PRIVATE KEY-----
";