use log::error;
use protobuf::Message;
use videocall_types::protos::packet_wrapper::PacketWrapper;
use videocall_types::Callback;
use wasm_bindgen::JsValue;
#[derive(Clone)]
pub struct ConnectOptions {
pub websocket_url: String,
pub webtransport_url: String,
pub on_inbound_media: Callback<PacketWrapper>,
pub on_connected: Callback<()>,
pub on_connection_lost: Callback<JsValue>,
pub peer_monitor: Callback<()>,
}
pub(super) trait WebMedia<TASK> {
fn connect(options: ConnectOptions) -> anyhow::Result<TASK>;
fn send_bytes(&self, bytes: Vec<u8>);
fn send_bytes_datagram(&self, bytes: Vec<u8>) {
self.send_bytes(bytes);
}
fn send_packet(&self, packet: PacketWrapper) {
match packet
.write_to_bytes()
.map_err(|w| JsValue::from(format!("{w:?}")))
{
Ok(bytes) => self.send_bytes(bytes),
Err(e) => {
let packet_type = packet.packet_type.enum_value_or_default();
error!("error sending {packet_type} packet: {e:?}");
}
}
}
fn send_packet_datagram(&self, packet: PacketWrapper) {
match packet
.write_to_bytes()
.map_err(|w| JsValue::from(format!("{w:?}")))
{
Ok(bytes) => self.send_bytes_datagram(bytes),
Err(e) => {
let packet_type = packet.packet_type.enum_value_or_default();
error!("error sending {packet_type} packet via datagram: {e:?}");
}
}
}
}