feat: ✨ rtc peer connection send_offer, receive_offer
This commit is contained in:
parent
0aa65f0f60
commit
ffc802eb59
4 changed files with 102 additions and 28 deletions
|
@ -4,7 +4,10 @@ use leptos::{
|
||||||
ev,
|
ev,
|
||||||
html::{ElementChild, button, form, input},
|
html::{ElementChild, button, form, input},
|
||||||
logging::log,
|
logging::log,
|
||||||
prelude::{BindAttribute, Get, OnAttribute, Read, Show, ShowProps, ToChildren, signal},
|
prelude::{
|
||||||
|
BindAttribute, Get, OnAttribute, Read, ReadSignal, Show, ShowProps, ToChildren,
|
||||||
|
WriteSignal, signal,
|
||||||
|
},
|
||||||
server::LocalResource,
|
server::LocalResource,
|
||||||
task::spawn_local,
|
task::spawn_local,
|
||||||
};
|
};
|
||||||
|
@ -38,42 +41,45 @@ pub fn app() -> impl IntoView {
|
||||||
}))
|
}))
|
||||||
.fallback(|| button().child("Sad Button"))
|
.fallback(|| button().child("Sad Button"))
|
||||||
.build();
|
.build();
|
||||||
(Show(props), signalling(), rtc())
|
let username = signal(String::from(""));
|
||||||
|
(Show(props), signalling(username), rtc(username.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn signalling() -> impl IntoView {
|
fn signalling(username: (ReadSignal<String>, WriteSignal<String>)) -> impl IntoView {
|
||||||
let signalling_server_input_data = signal(String::new());
|
|
||||||
let signalling_trigger = move || {
|
let signalling_trigger = move || {
|
||||||
spawn_local(start_signalling(
|
spawn_local(start_signalling(username.0.get()));
|
||||||
"Zurna Dürüm".to_string(),
|
|
||||||
signalling_server_input_data.0.get(),
|
|
||||||
))
|
|
||||||
};
|
};
|
||||||
let signalling_server_input = form()
|
let signalling_server_input = form()
|
||||||
.child(
|
.child(
|
||||||
input()
|
input()
|
||||||
.bind(Value, signalling_server_input_data)
|
.bind(Value, username)
|
||||||
.placeholder("0.0.0.0:4546")
|
.placeholder("Some Username")
|
||||||
.r#type("text"),
|
.r#type("text"),
|
||||||
)
|
)
|
||||||
.on(ev::submit, move |event| {
|
.on(ev::submit, move |event| {
|
||||||
event.prevent_default();
|
event.prevent_default();
|
||||||
signalling_trigger()
|
signalling_trigger();
|
||||||
});
|
});
|
||||||
|
|
||||||
let signalling_submit_button = button()
|
let signalling_submit_button = button()
|
||||||
.on(ev::click, move |_| signalling_trigger())
|
.on(ev::click, move |event| {
|
||||||
|
event.prevent_default();
|
||||||
|
signalling_trigger();
|
||||||
|
})
|
||||||
.child("Signal");
|
.child("Signal");
|
||||||
(signalling_server_input, signalling_submit_button)
|
(signalling_server_input, signalling_submit_button)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rtc() -> impl IntoView {
|
fn rtc(username: ReadSignal<String>) -> impl IntoView {
|
||||||
let rtc_trigger = || {
|
let rtc_trigger = move || {
|
||||||
spawn_local(offer());
|
spawn_local(offer(username.get()));
|
||||||
};
|
};
|
||||||
|
|
||||||
let rtc_start_button = button()
|
let rtc_start_button = button()
|
||||||
.on(ev::click, move |_| rtc_trigger())
|
.on(ev::click, move |event| {
|
||||||
|
event.prevent_default();
|
||||||
|
rtc_trigger();
|
||||||
|
})
|
||||||
.child("RTC Offer");
|
.child("RTC Offer");
|
||||||
rtc_start_button
|
rtc_start_button
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use leptos::logging::log;
|
use leptos::logging::log;
|
||||||
|
use protocol::RTCSessionOffer;
|
||||||
use wasm_bindgen_futures::JsFuture;
|
use wasm_bindgen_futures::JsFuture;
|
||||||
use web_sys::{
|
use web_sys::{
|
||||||
RtcConfiguration, RtcIceServer, RtcPeerConnection, RtcSessionDescriptionInit,
|
RtcConfiguration, RtcIceServer, RtcPeerConnection, RtcSessionDescriptionInit,
|
||||||
|
@ -6,7 +7,9 @@ use web_sys::{
|
||||||
wasm_bindgen::{JsCast, JsValue},
|
wasm_bindgen::{JsCast, JsValue},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub async fn offer() {
|
use crate::signal::send_offer;
|
||||||
|
|
||||||
|
pub async fn offer(username: String) {
|
||||||
let ice_server_addresses = vec![JsValue::from("stun:stun.l.google.com:19302")]
|
let ice_server_addresses = vec![JsValue::from("stun:stun.l.google.com:19302")]
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.collect::<Array>();
|
.collect::<Array>();
|
||||||
|
@ -33,6 +36,12 @@ pub async fn offer() {
|
||||||
.as_string()
|
.as_string()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
log!("{}", rtc_session_offer);
|
log!("{}", rtc_session_offer);
|
||||||
|
|
||||||
|
send_offer(RTCSessionOffer {
|
||||||
|
username,
|
||||||
|
rtc_session_offer,
|
||||||
|
})
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn answer() {}
|
pub async fn answer() {}
|
||||||
|
|
|
@ -1,18 +1,31 @@
|
||||||
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
use chrono::DateTime;
|
use chrono::DateTime;
|
||||||
use leptos::logging::log;
|
use leptos::logging::log;
|
||||||
use protocol::Signal;
|
use protocol::{RTCSessionOffer, Signal};
|
||||||
use serde_json::json;
|
use reqwest::Response;
|
||||||
|
use serde_json::{Value, json};
|
||||||
|
|
||||||
pub async fn start_signalling(username: String, signal_address: String) {
|
const SIGNALLING_ADDRESS: &str = "http://127.0.0.1:4546";
|
||||||
|
static REQUEST_CLIENT: LazyLock<reqwest::Client> = LazyLock::new(|| reqwest::Client::new());
|
||||||
|
|
||||||
|
async fn post_json(json: &Value) -> Result<Response, reqwest::Error> {
|
||||||
|
REQUEST_CLIENT
|
||||||
|
.post(SIGNALLING_ADDRESS)
|
||||||
|
.json(json)
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn start_signalling(username: String) {
|
||||||
log!("Start Signalling");
|
log!("Start Signalling");
|
||||||
log!("{}\n{}", username, signal_address);
|
log!("{}\n{}", username, SIGNALLING_ADDRESS);
|
||||||
let request_client = reqwest::Client::new();
|
|
||||||
let signal = Signal {
|
let signal = Signal {
|
||||||
username,
|
username,
|
||||||
time: DateTime::default(),
|
time: DateTime::default(),
|
||||||
};
|
};
|
||||||
let body = json!(signal);
|
let json = json!(signal);
|
||||||
match request_client.post(signal_address).json(&body).send().await {
|
match post_json(&json).await {
|
||||||
Ok(signal_response) => log!("{:#?}", signal_response),
|
Ok(signal_response) => log!("{:#?}", signal_response),
|
||||||
Err(err_val) => {
|
Err(err_val) => {
|
||||||
log!("Error: Signal Post | {}", err_val);
|
log!("Error: Signal Post | {}", err_val);
|
||||||
|
@ -20,7 +33,42 @@ pub async fn start_signalling(username: String, signal_address: String) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn send_offer() {}
|
pub async fn send_offer(rtc_session_offer: RTCSessionOffer) {
|
||||||
pub async fn receive_offer() {}
|
let rtc_session_offer = json!(rtc_session_offer);
|
||||||
pub async fn send_answer() {}
|
match post_json(&rtc_session_offer).await {
|
||||||
pub async fn receive_answer() {}
|
Ok(signal_response) => log!("{:#?}", signal_response),
|
||||||
|
Err(err_val) => {
|
||||||
|
log!("Error: Signal Post | {}", err_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn receive_offer(username: String) {
|
||||||
|
let json = json!(username);
|
||||||
|
match post_json(&json).await {
|
||||||
|
Ok(signal_response) => log!("{:#?}", signal_response),
|
||||||
|
Err(err_val) => {
|
||||||
|
log!("Error: Signal Post | {}", err_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn send_answer(rtc_session_offer: RTCSessionOffer) {
|
||||||
|
let rtc_session_offer = json!(rtc_session_offer);
|
||||||
|
match post_json(&rtc_session_offer).await {
|
||||||
|
Ok(signal_response) => log!("{:#?}", signal_response),
|
||||||
|
Err(err_val) => {
|
||||||
|
log!("Error: Signal Post | {}", err_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn receive_answer(username: String) {
|
||||||
|
let json = json!(username);
|
||||||
|
match post_json(&json).await {
|
||||||
|
Ok(signal_response) => log!("{:#?}", signal_response),
|
||||||
|
Err(err_val) => {
|
||||||
|
log!("Error: Signal Post | {}", err_val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,3 +6,14 @@ pub struct Signal {
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub time: DateTime<Utc>,
|
pub time: DateTime<Utc>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct RTCSessionOffer {
|
||||||
|
pub username: String,
|
||||||
|
pub rtc_session_offer: String,
|
||||||
|
}
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct RTCSessionAnswer {
|
||||||
|
pub username: String,
|
||||||
|
pub rtc_session_offer: String,
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue