rustream/
constant.rs

1use std::collections::HashMap;
2use std::env;
3use std::sync::{Arc, Mutex};
4
5use fernet::Fernet;
6
7pub static IMAGE_FORMATS: [&str; 7] = ["jpeg", "jpg", "png", "gif", "bmp", "svg", "webp"];
8pub static SECURE_INDEX: &str = "SECURE_INDEX";
9
10/// Struct to store the cargo information gathered at compile time using the `env!` macro.
11#[allow(dead_code)]
12#[derive(Debug, Clone)]
13pub struct MetaData {
14    pub crate_name: String,
15    pub manifest_dir: String,
16    pub authors: Vec<String>,
17    pub description: String,
18    pub homepage: String,
19    pub pkg_name: String,
20    pub pkg_repo: String,
21    pub pkg_version: String,
22    pub pkg_version_major: String,
23    pub pkg_version_minor: String,
24    pub pkg_version_patch: String,
25    pub pkg_version_pre: String,
26}
27
28/// Uses compile time macros to load Cargo metadata via environment variables during compilation process
29///
30/// ## References
31/// - [Official Docs](https://doc.rust-lang.org/cargo/reference/environment-variables.html)
32/// - [GitHub Issues](https://github.com/rust-lang/cargo/issues/8251#issuecomment-631731144)
33/// - [GitHub Issues](https://github.com/rust-lang/cargo/issues/11966#issue-1664748892)
34pub fn build_info() -> Arc<MetaData> {
35    let metadata = MetaData {
36        crate_name: env!("CARGO_CRATE_NAME").to_string(),
37        manifest_dir: env!("CARGO_MANIFEST_DIR").to_string(),
38        authors: env!("CARGO_PKG_AUTHORS").split(',').map(String::from).collect(),
39        description: env!("CARGO_PKG_DESCRIPTION").to_string(),
40        homepage: env!("CARGO_PKG_HOMEPAGE").to_string(),
41        pkg_name: env!("CARGO_PKG_NAME").to_string(),
42        pkg_repo: env!("CARGO_PKG_REPOSITORY").to_string(),
43        pkg_version: env!("CARGO_PKG_VERSION").to_string(),
44        pkg_version_major: env!("CARGO_PKG_VERSION_MAJOR").to_string(),
45        pkg_version_minor: env!("CARGO_PKG_VERSION_MINOR").to_string(),
46        pkg_version_patch: env!("CARGO_PKG_VERSION_PATCH").to_string(),
47        pkg_version_pre: env!("CARGO_PKG_VERSION_PRE").to_string(),
48    };
49    Arc::new(metadata)
50}
51
52/// Struct to store the session information.
53///
54/// ## Fields
55///
56/// * `tracker` - Used to log connection and streaming information without redundancy.
57/// * `mapping` - Used to store username and session token's payload as key value pairs.
58///
59/// ## See Also:
60///
61/// These fields are updated and used only for authenticated sessions.
62pub struct Session {
63    pub tracker: Mutex<HashMap<String, String>>,
64    pub mapping: Mutex<HashMap<String, String>>,
65}
66
67
68/// Instantiates the `Session` struct with empty `HashMap` for both `tracker` and `mapping` fields.
69///
70/// ## See Also
71///
72/// Creates new `Mutex` in an unlocked state for each of the fields.
73///
74/// # Returns
75///
76/// Returns the constructed `Arc` for the `Session` struct.
77pub fn session_info() -> Arc<Session> {
78    Arc::new(Session {
79        tracker: Mutex::new(HashMap::new()),
80        mapping: Mutex::new(HashMap::new()),
81    })
82}
83
84/// Create a [Fernet](https://docs.rs/fernet/latest/fernet/) object to encrypt and decrypt session token.
85///
86/// Generates a random key, that can be safely passed to `Fernet::new()`
87///
88/// # Returns
89///
90/// Returns the constructed `Arc` for the `Fernet` instance, with the generated key.
91pub fn fernet_object() -> Arc<Fernet> {
92    Arc::new(Fernet::new(&Fernet::generate_key()).unwrap())
93}