use url::Url;
use super::BoxFuture;
use super::ModelRef;
use super::ServiceRef;
use super::model_ref::ref_conversions;
use crate::error::NoSuchModelError;
use crate::error::ProviderError;
use crate::json::JsonValue;
use crate::realtime_model::ClientSecret;
use crate::realtime_model::ClientSecretOptions;
use crate::realtime_model::GetTokenOptions;
use crate::realtime_model::RealtimeClientEvent;
use crate::realtime_model::RealtimeFactory;
use crate::realtime_model::RealtimeModel;
use crate::realtime_model::RealtimeServerEvent;
use crate::realtime_model::RealtimeSessionConfig;
use crate::realtime_model::WebSocketConfig;
use crate::shared::ModelId;
use crate::shared::ProviderId;
pub trait DynRealtimeModel: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model_id(&self) -> &ModelId;
fn do_create_client_secret(
&self,
options: ClientSecretOptions,
) -> BoxFuture<'_, Result<ClientSecret, ProviderError>>;
fn websocket_config(&self, token: &str, url: &Url) -> WebSocketConfig;
fn parse_server_event(&self, raw: JsonValue)
-> Result<Vec<RealtimeServerEvent>, ProviderError>;
fn serialize_client_event(
&self,
event: RealtimeClientEvent,
) -> BoxFuture<'_, Result<JsonValue, ProviderError>>;
fn build_session_config(
&self,
config: &RealtimeSessionConfig,
) -> Result<JsonValue, ProviderError>;
fn health_check_response(&self, raw: &JsonValue) -> Option<JsonValue>;
}
impl<T: RealtimeModel> DynRealtimeModel for T {
fn provider(&self) -> &ProviderId {
RealtimeModel::provider(self)
}
fn model_id(&self) -> &ModelId {
RealtimeModel::model_id(self)
}
fn do_create_client_secret(
&self,
options: ClientSecretOptions,
) -> BoxFuture<'_, Result<ClientSecret, ProviderError>> {
Box::pin(RealtimeModel::do_create_client_secret(self, options))
}
fn websocket_config(&self, token: &str, url: &Url) -> WebSocketConfig {
RealtimeModel::websocket_config(self, token, url)
}
fn parse_server_event(
&self,
raw: JsonValue,
) -> Result<Vec<RealtimeServerEvent>, ProviderError> {
RealtimeModel::parse_server_event(self, raw)
}
fn serialize_client_event(
&self,
event: RealtimeClientEvent,
) -> BoxFuture<'_, Result<JsonValue, ProviderError>> {
Box::pin(RealtimeModel::serialize_client_event(self, event))
}
fn build_session_config(
&self,
config: &RealtimeSessionConfig,
) -> Result<JsonValue, ProviderError> {
RealtimeModel::build_session_config(self, config)
}
fn health_check_response(&self, raw: &JsonValue) -> Option<JsonValue> {
RealtimeModel::health_check_response(self, raw)
}
}
pub type RealtimeModelRef = ModelRef<dyn DynRealtimeModel>;
ref_conversions!(RealtimeModelRef, RealtimeModel, DynRealtimeModel);
pub trait DynRealtimeFactory: Send + Sync + 'static {
fn provider(&self) -> &ProviderId;
fn model(&self, model_id: &str) -> Result<RealtimeModelRef, NoSuchModelError>;
fn get_token(
&self,
options: GetTokenOptions,
) -> BoxFuture<'_, Result<ClientSecret, ProviderError>>;
}
impl<T: RealtimeFactory> DynRealtimeFactory for T {
fn provider(&self) -> &ProviderId {
RealtimeFactory::provider(self)
}
fn model(&self, model_id: &str) -> Result<RealtimeModelRef, NoSuchModelError> {
RealtimeFactory::model(self, model_id)
}
fn get_token(
&self,
options: GetTokenOptions,
) -> BoxFuture<'_, Result<ClientSecret, ProviderError>> {
Box::pin(RealtimeFactory::get_token(self, options))
}
}
pub type RealtimeFactoryRef = ServiceRef<dyn DynRealtimeFactory>;
ref_conversions!(RealtimeFactoryRef, RealtimeFactory, DynRealtimeFactory);