feat: ✨ bidirectional text transfer
This commit is contained in:
parent
be4f3333bc
commit
b626709587
6 changed files with 1488 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1319
Cargo.lock
generated
Normal file
1319
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "voice_chat"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
s2n-quic = "1.54.0"
|
||||||
|
tokio = { version = "1.43.0", features = ["full"] }
|
34
certificates/cert.pem
Normal file
34
certificates/cert.pem
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIF1zCCA7+gAwIBAgIUebuL+Py/iYfh5YJh8MeAq01P/7MwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwezELMAkGA1UEBhMCWFgxEjAQBgNVBAgMCVN0YXRlTmFtZTERMA8GA1UEBwwI
|
||||||
|
Q2l0eU5hbWUxFDASBgNVBAoMC0NvbXBhbnlOYW1lMRswGQYDVQQLDBJDb21wYW55
|
||||||
|
U2VjdGlvbk5hbWUxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yNTAzMDEwMDAyMDha
|
||||||
|
Fw0zNTAyMjcwMDAyMDhaMHsxCzAJBgNVBAYTAlhYMRIwEAYDVQQIDAlTdGF0ZU5h
|
||||||
|
bWUxETAPBgNVBAcMCENpdHlOYW1lMRQwEgYDVQQKDAtDb21wYW55TmFtZTEbMBkG
|
||||||
|
A1UECwwSQ29tcGFueVNlY3Rpb25OYW1lMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIi
|
||||||
|
MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuCGUWsnP5KNBLNcPN3npHpt6y
|
||||||
|
VKX37w3Qd190oyxOBLzMLDBb3QZ9JqmFAghhhupYV/e9xRWCHUbNifHZxfkf2uSR
|
||||||
|
1bdfi6KcPU7uHqF6+zmPp6SQ1tYN+iCqEeprlzw3dnnSvvWbe3DSWmT8oXJwXZtG
|
||||||
|
ExY0QNRky23QBpcAUcTAO/JMGRvimxqNPHRUHxQibLUefZjoXQg5CGoREhubPkGy
|
||||||
|
Y1qPSTPR6khcSitQ006TVnpEo4YjDDwhP+oGAMBP0eAn6tfLWDGHlOfRxqW8a3EX
|
||||||
|
FL2J0ZwthJlP8lJnrYur9f2GELruhgD6vebIZQDF6/0yoZ07hc3wA5V+FxwgzcyK
|
||||||
|
MOvf7zAQQwL5Cj1VnN6t4mbhjoJOat3mgLFE87PGr6zGlqeovFOE2k5IuDCzd6VN
|
||||||
|
7UK/F36zxBVfrGVbE9FqdjdVU2OR2tBY3+De2DvBnHI6PXH1rC51pJytMjhACGNu
|
||||||
|
txsOaQiU3G2RzUqaxI7NqLyoL6mAfuzDvtDz9WKbf6rXFncRla8fbTmZ3C6hZh0l
|
||||||
|
IIb9wk6DWALL4n1l2wF1Lpe+gWgY1QVq8alZX9qvCVwHQr24URXv23HQgAPaTpv4
|
||||||
|
c/b7eCymHLYp9CHGtgXKwlFj1Msju26OMVZ13qugOR2eF/OmsaonLVt10jX5y+VW
|
||||||
|
FUS9QjynjRqKw0yPBwIDAQABo1MwUTAdBgNVHQ4EFgQUcPQsBRhlo9zFSSFw1Mgz
|
||||||
|
COo8Ll4wHwYDVR0jBBgwFoAUcPQsBRhlo9zFSSFw1MgzCOo8Ll4wDwYDVR0TAQH/
|
||||||
|
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAY3724fnTOLR8eMIP06+lF9p18DD+
|
||||||
|
Or10CgaGyamCofkrA84bbN+gGdVBWlk3V2c1E9C4yna2iqQUwf8JJIzTdEZbmOU1
|
||||||
|
vwLu7YCGMgISOwUEEwXzdLOsQg2AEmfpI2nru5pUZFrvrBbDwfkyWckv5ZjNiHlB
|
||||||
|
nTmgatcGHTY2BKzQJzLHuo8HimFrfMXDMatb8K0OdujSYFuQ6Hk4L9NK0nx0art4
|
||||||
|
3t5IIXg0R34mpghz+lm/FEJdKUJYsW/Czb48ro2pb1DL673PmfJ4qQC31lINiaRO
|
||||||
|
AWrfjWOsELGEFzHbFnMukUn5C7HMNnu3XZ8X/d0zxELUkKDKGXC42mWRDjWkklB/
|
||||||
|
UhLHgy9xBmv8cQwZ+6IHppAT0wb+yYPP+xfkXeRQTmz7SDVIInm8mZxHDQbGcFsw
|
||||||
|
caXgF1U4KiMKXglq/gU7Y7zMJzLxxCiSgdngY2baP7ivO7Oh3kjvO9NmLIlk2fHE
|
||||||
|
qztnQS3CX3hIE5MKN2JKeY20HMALz73XpfzPkACt6/9iIUeHKoHJrL9pP+2mI18l
|
||||||
|
KAJUDgBgyxtMg8UiFihpeBrzqiv+JxP9v3LPKaJhITNOS7fQUWBH0YM2Y2uWm+qh
|
||||||
|
GQfCL1GS/QZINf5bkDgcM6R2sACXL+ysCY9b+xl1oWnIY21TbmbughxLNsb0SVEJ
|
||||||
|
YMPR5Ge743qMQLg=
|
||||||
|
-----END CERTIFICATE-----
|
52
certificates/key.pem
Normal file
52
certificates/key.pem
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
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
|
||||||
|
OMQMuXIQAe6ADrQYo1TtBAwZwM7Jtf4=
|
||||||
|
-----END PRIVATE KEY-----
|
74
src/main.rs
Normal file
74
src/main.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
use std::{net::SocketAddr, path::Path, time::Duration};
|
||||||
|
|
||||||
|
use s2n_quic::{Client, Server, client::Connect};
|
||||||
|
|
||||||
|
const SERVER_ADDRESS: &str = "127.0.0.1:2021";
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
|
||||||
|
tokio::spawn(server());
|
||||||
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
||||||
|
client().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn server() {
|
||||||
|
let mut server = Server::builder()
|
||||||
|
.with_io(SERVER_ADDRESS)
|
||||||
|
.unwrap()
|
||||||
|
.with_tls((
|
||||||
|
Path::new("certificates/cert.pem"),
|
||||||
|
Path::new("certificates/key.pem"),
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.start()
|
||||||
|
.unwrap();
|
||||||
|
while let Some(mut connection) = server.accept().await {
|
||||||
|
println!(
|
||||||
|
"Server Name = {}",
|
||||||
|
connection.server_name().unwrap().unwrap().to_string()
|
||||||
|
);
|
||||||
|
while let Ok(Some(mut stream)) = connection.accept_bidirectional_stream().await {
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
String::from_utf8(stream.receive().await.unwrap().unwrap().to_vec()).unwrap()
|
||||||
|
);
|
||||||
|
stream
|
||||||
|
.send("Hi from Tahinli too".as_bytes().into())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn client() {
|
||||||
|
let client = Client::builder()
|
||||||
|
.with_io("127.0.0.1:0")
|
||||||
|
.unwrap()
|
||||||
|
.with_tls(Path::new("certificates/cert.pem"))
|
||||||
|
.unwrap()
|
||||||
|
.start()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
println!("Client Address = {}", client.local_addr().unwrap());
|
||||||
|
let connect =
|
||||||
|
Connect::new(SERVER_ADDRESS.parse::<SocketAddr>().unwrap()).with_server_name("localhost");
|
||||||
|
let mut connection = match client.connect(connect).await {
|
||||||
|
Ok(connection) => connection,
|
||||||
|
Err(err_val) => {
|
||||||
|
eprintln!("Client Connection | {}", err_val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
connection.keep_alive(true).unwrap();
|
||||||
|
|
||||||
|
let stream = connection.open_bidirectional_stream().await.unwrap();
|
||||||
|
let (mut receive_stream, mut send_stream) = stream.split();
|
||||||
|
send_stream
|
||||||
|
.send("Hi from Tahinli".as_bytes().into())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let received = receive_stream.receive().await.unwrap().unwrap();
|
||||||
|
println!("{}", String::from_utf8(received.to_vec()).unwrap());
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue