initial commit
This commit is contained in:
parent
8522dd3f40
commit
b08b6de26d
7 changed files with 1421 additions and 1 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1336
Cargo.lock
generated
Normal file
1336
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[workspace]
|
||||||
|
members = ["api"]
|
||||||
|
resolver = "2"
|
||||||
|
[workspace.dev-dependencies]
|
||||||
|
cucumber = "0.20"
|
||||||
|
futures = "0.3.30"
|
21
README.md
21
README.md
|
@ -1,3 +1,22 @@
|
||||||
# shoutcat
|
# shoutcat
|
||||||
|
|
||||||
a chat protocol or something. We have no clue what we're doing, please help
|
- verteiltes netzwerk an servern
|
||||||
|
- shoutcat besteht aus einem verteilten netzwerk an servern die über das internet verbunden sind
|
||||||
|
- Jeder Node (server) trägt zur Gesamtfunktionalität des Netzwerkes bei und kann mit anderen Servern kommunizieren
|
||||||
|
- verbindungen werden über ein relay hergestellt (zunächst bereitgestellt von dem server von dem aus der chat initialisiert wurde)
|
||||||
|
- Kommunikation zwischen den Clients und dem Relay über das QUIC-Protokoll
|
||||||
|
- Raft als Distributed Consensus System
|
||||||
|
- Raft verhindert nicht dass ein node malicious ist, wird aber früher oder später einen konsistenten Zusant über alle Server erreichen und Trifft die Entscheidung welcher node leader an einem relay ist
|
||||||
|
- Jeder Server ist ein raft-node
|
||||||
|
- Bei Serverausfällen oÄ wählt Raft einen neuen Leader um Kontinuität zu gewährleisten
|
||||||
|
- Clients als Server
|
||||||
|
- Die Clients sollen auch als Server agieren können?
|
||||||
|
- Dentrales speichern / weitergeben von Daten via IPFS?
|
||||||
|
|
||||||
|
|
||||||
|
- Verbindungsaufbau:
|
||||||
|
- Ein Client initialisiert eine Verbindung zum Relay-Server um an Shoutcat netzwerk teilzunehmen
|
||||||
|
- Der Relayserver ermöglicht es den clients sich gegenseitig zu entdecken und nachrichten auszutauschen
|
||||||
|
- Nachrichtenaustausch
|
||||||
|
- Die clients können nachrichten senden und empfangen, das relay dient als vermittler
|
||||||
|
- die verbindung zum relay und übertragung der nachrichten passiert über das QUIC protokoll
|
||||||
|
|
13
api/Cargo.toml
Normal file
13
api/Cargo.toml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
[package]
|
||||||
|
name = "api"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
actix-web = "4.5.1"
|
||||||
|
anyhow = "1.0.81"
|
||||||
|
serde = "1.0.197"
|
||||||
|
uuid = {version = "1.8.0", features = ["v4"]}
|
||||||
|
|
31
api/src/endpoints.rs
Normal file
31
api/src/endpoints.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
use actix_web::{web, App, HttpServer, Responder, HttpResponse};
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
use uuid::Uuid;
|
||||||
|
use std::sync::mutex;
|
||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct User {
|
||||||
|
uuid: Uuid,
|
||||||
|
server: Server
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct Server {
|
||||||
|
address: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
struct Relay {
|
||||||
|
uuid: Uuid,
|
||||||
|
name: String,
|
||||||
|
members: Mutex<Vec<User>>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Default)]
|
||||||
|
struct AppState {
|
||||||
|
users: Mutex<Vec<User>>,
|
||||||
|
relays: Mutex<Vec<Relay>>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
14
api/src/lib.rs
Normal file
14
api/src/lib.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
pub fn add(left: usize, right: usize) -> usize {
|
||||||
|
left + right
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_works() {
|
||||||
|
let result = add(2, 2);
|
||||||
|
assert_eq!(result, 4);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue