summaryrefslogtreecommitdiff
path: root/client-native-rift/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-10-07 23:25:39 +0200
committermetamuffin <metamuffin@disroot.org>2022-10-07 23:25:39 +0200
commit1d23f7b835ec6714cda248981e642c48fc551dce (patch)
tree8f2f37269598e7d7fdf42d511c1eae7bea30c47a /client-native-rift/src
parent0b75a0609e65a4d09e12d9f8466d6ece52869a94 (diff)
downloadkeks-meet-1d23f7b835ec6714cda248981e642c48fc551dce.tar
keks-meet-1d23f7b835ec6714cda248981e642c48fc551dce.tar.bz2
keks-meet-1d23f7b835ec6714cda248981e642c48fc551dce.tar.zst
transport works.
Diffstat (limited to 'client-native-rift/src')
-rw-r--r--client-native-rift/src/main.rs104
1 files changed, 92 insertions, 12 deletions
diff --git a/client-native-rift/src/main.rs b/client-native-rift/src/main.rs
index 613a4e6..8ccb7d8 100644
--- a/client-native-rift/src/main.rs
+++ b/client-native-rift/src/main.rs
@@ -8,9 +8,13 @@
use bytes::Bytes;
use clap::{Parser, Subcommand};
use client_native_lib::{
- instance::Instance, peer::Peer, webrtc::data_channel::RTCDataChannel, Config, EventHandler,
+ instance::Instance,
+ peer::{Peer, TransportChannel},
+ protocol::ProvideInfo,
+ webrtc::data_channel::RTCDataChannel,
+ Config, DynFut, EventHandler, LocalResource,
};
-use log::{error, info};
+use log::{error, info, warn};
use std::{future::Future, pin::Pin, sync::Arc};
use tokio::{
fs::File,
@@ -30,7 +34,7 @@ fn main() {
.block_on(run())
}
-#[derive(Parser)]
+#[derive(Parser, Clone)]
pub struct Args {
/// keks-meet server used for establishing p2p connection
#[clap(long, default_value = "wss://meet.metamuffin.org")]
@@ -54,7 +58,9 @@ async fn run() {
signaling_uri: args.signaling_uri.clone(),
username: args.username.clone(),
},
- Box::new(Handler {}),
+ Arc::new(Handler {
+ args: Arc::new(args.clone()),
+ }),
)
.await;
@@ -64,30 +70,91 @@ async fn run() {
error!("interrupt received, exiting");
}
-struct Handler {}
+#[derive(Clone)]
+struct Handler {
+ args: Arc<Args>,
+}
impl EventHandler for Handler {
- fn remote_resource_added(
+ fn peer_join(&self, peer: Arc<Peer>) -> client_native_lib::DynFut<()> {
+ Box::pin(async move {})
+ }
+
+ fn peer_leave(&self, peer: Arc<Peer>) -> client_native_lib::DynFut<()> {
+ Box::pin(async move {})
+ }
+ fn resource_added(
&self,
peer: Arc<Peer>,
info: client_native_lib::protocol::ProvideInfo,
- ) -> Pin<Box<dyn Future<Output = ()>>> {
+ ) -> DynFut<()> {
let id = info.id.clone();
Box::pin(async move {
peer.request_resource(id).await;
})
}
+ fn resource_removed(&self, peer: Arc<Peer>, id: String) -> DynFut<()> {
+ Box::pin(async {})
+ }
- fn remote_resource_removed(
+ fn resource_connected(
&self,
peer: Arc<Peer>,
- id: String,
- ) -> Pin<Box<dyn Future<Output = ()>>> {
- Box::pin(async {})
+ resource: &ProvideInfo,
+ channel: TransportChannel,
+ ) -> client_native_lib::DynFut<()> {
+ let resource = resource.clone();
+ let s = self.clone();
+ Box::pin(async move {
+ match channel {
+ TransportChannel::Track(_) => warn!("wrong type"),
+ TransportChannel::DataChannel(dc) => {
+ if resource.kind != "file" {
+ return error!("we got a non-file resource for some reason…");
+ }
+ let writer = Arc::new(RwLock::new(None));
+ {
+ let writer = writer.clone();
+ dc.on_open(box move || {
+ let s = s.clone();
+ let writer = writer.clone();
+ Box::pin(async move {
+ info!("channel opened");
+ *writer.write().await = Some(s.args.action.create_writer().await)
+ })
+ })
+ .await;
+ }
+ {
+ let writer = writer.clone();
+ dc.on_close(box move || {
+ let writer = writer.clone();
+ Box::pin(async move {
+ info!("channel closed");
+ *writer.write().await = None;
+ })
+ })
+ .await;
+ }
+ dc.on_message(box move |mesg| {
+ Box::pin(async move {
+ info!("{:?} bytes of data", mesg.data.len());
+ })
+ })
+ .await;
+ dc.on_error(box move |err| {
+ Box::pin(async move {
+ error!("data channel errored: {err}");
+ })
+ })
+ .await;
+ }
+ }
+ })
}
}
-#[derive(Subcommand)]
+#[derive(Subcommand, Clone)]
pub enum Action {
/// Send a file
Send { filename: Option<String> },
@@ -122,6 +189,19 @@ impl Action {
}
}
+struct FileSender {
+ info: ProvideInfo,
+}
+impl LocalResource for FileSender {
+ fn info(&self) -> client_native_lib::protocol::ProvideInfo {
+ self.info.clone()
+ }
+
+ fn on_request(&self, peer: Arc<Peer>) -> DynFut<()> {
+ Box::pin(async move {})
+ }
+}
+
// pub struct Conn {
// pub args: Arc<Args>,
// }