use actr_protocol::{ActorResult, ActrId, ActrType, DataStream, PayloadType};
use async_trait::async_trait;
use futures_util::future::BoxFuture;
#[cfg(not(target_arch = "wasm32"))]
pub trait MaybeSendSync: Send + Sync {}
#[cfg(not(target_arch = "wasm32"))]
impl<T: Send + Sync + ?Sized> MaybeSendSync for T {}
#[cfg(target_arch = "wasm32")]
pub trait MaybeSendSync {}
#[cfg(target_arch = "wasm32")]
impl<T: ?Sized> MaybeSendSync for T {}
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
pub trait Context: Clone + MaybeSendSync + 'static {
fn self_id(&self) -> &ActrId;
fn caller_id(&self) -> Option<&ActrId>;
fn request_id(&self) -> &str;
async fn call<R: actr_protocol::RpcRequest>(
&self,
target: &crate::Dest,
request: R,
) -> ActorResult<R::Response>;
async fn tell<R: actr_protocol::RpcRequest>(
&self,
target: &crate::Dest,
message: R,
) -> ActorResult<()>;
async fn register_stream<F>(&self, stream_id: String, callback: F) -> ActorResult<()>
where
F: Fn(DataStream, ActrId) -> BoxFuture<'static, ActorResult<()>> + Send + Sync + 'static;
async fn unregister_stream(&self, stream_id: &str) -> ActorResult<()>;
async fn send_data_stream(
&self,
target: &crate::Dest,
chunk: DataStream,
payload_type: PayloadType,
) -> ActorResult<()>;
async fn discover_route_candidate(&self, target_type: &ActrType) -> ActorResult<ActrId>;
async fn call_raw(
&self,
target: &ActrId,
route_key: &str,
payload: bytes::Bytes,
) -> ActorResult<bytes::Bytes>;
async fn register_media_track<F>(&self, track_id: String, callback: F) -> ActorResult<()>
where
F: Fn(MediaSample, ActrId) -> BoxFuture<'static, ActorResult<()>> + Send + Sync + 'static;
async fn unregister_media_track(&self, track_id: &str) -> ActorResult<()>;
async fn send_media_sample(
&self,
target: &crate::Dest,
track_id: &str,
sample: MediaSample,
) -> ActorResult<()>;
async fn add_media_track(
&self,
target: &crate::Dest,
track_id: &str,
codec: &str,
media_type: &str,
) -> ActorResult<()>;
async fn remove_media_track(&self, target: &crate::Dest, track_id: &str) -> ActorResult<()>;
fn log(&self, level: LogLevel, msg: &str) {
match level {
LogLevel::Trace => tracing::trace!(target: "actr_framework::workload", "{msg}"),
LogLevel::Debug => tracing::debug!(target: "actr_framework::workload", "{msg}"),
LogLevel::Info => tracing::info!(target: "actr_framework::workload", "{msg}"),
LogLevel::Warn => tracing::warn!(target: "actr_framework::workload", "{msg}"),
LogLevel::Error => tracing::error!(target: "actr_framework::workload", "{msg}"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Clone)]
pub struct MediaSample {
pub data: bytes::Bytes,
pub timestamp: u32,
pub codec: String,
pub media_type: MediaType,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MediaType {
Audio,
Video,
}