#![warn(missing_docs)]
pub mod extension;
pub mod service;
use std::result::Result;
use std::sync::Arc;
use async_trait::async_trait;
use rings_core::message::MessagePayload;
use rings_core::message::MessageVerificationExt;
use crate::backend::native::extension::Extension;
use crate::backend::native::extension::ExtensionConfig;
use crate::backend::native::service::ServiceConfig;
use crate::backend::native::service::ServiceProvider;
use crate::backend::types::BackendMessage;
use crate::backend::types::MessageHandler;
use crate::error::Error;
use crate::provider::Provider;
pub struct BackendConfig {
pub services: Vec<ServiceConfig>,
pub extensions: ExtensionConfig,
}
pub struct BackendBehaviour {
server: ServiceProvider,
extension: Extension,
}
#[cfg_attr(feature = "browser", async_trait(?Send))]
#[cfg_attr(not(feature = "browser"), async_trait)]
impl MessageHandler<BackendMessage> for BackendBehaviour {
async fn handle_message(
&self,
provider: Arc<Provider>,
payload: &MessagePayload,
msg: &BackendMessage,
) -> Result<(), Box<dyn std::error::Error>> {
self.handle_backend_message(provider, payload, msg).await
}
}
impl BackendBehaviour {
pub async fn new(config: BackendConfig) -> Result<Self, Error> {
Ok(Self {
server: ServiceProvider::new(config.services),
extension: Extension::new(&config.extensions).await?,
})
}
pub fn service_names(&self) -> Vec<String> {
self.server
.services
.iter()
.filter_map(|x| x.register_service.clone())
.collect()
}
async fn handle_backend_message(
&self,
provider: Arc<Provider>,
payload: &MessagePayload,
msg: &BackendMessage,
) -> Result<(), Box<dyn std::error::Error>> {
match msg {
BackendMessage::Extension(data) => {
self.extension.handle_message(provider, payload, data).await
}
BackendMessage::ServiceMessage(data) => {
self.server.handle_message(provider, payload, data).await
}
BackendMessage::PlainText(text) => {
let peer_did = payload.transaction.signer();
tracing::info!("BackendMessage from {peer_did:?} PlainText: {text:?}");
Ok(())
}
_ => Ok(()),
}
}
}