use std::sync::Arc;
use bao_cdp::servo_bridge::{bridge_channel, BridgeSender};
use bao_cdp::{handle_command, CdpMessage};
use bao_cdp_client::transport::in_memory::{InMemoryBridge, InMemoryBridgeResponse};
const UNDRAINED_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(2);
pub struct MemoryCdpBridge {
sender: BridgeSender,
default_target: std::sync::Mutex<String>,
}
impl MemoryCdpBridge {
pub fn new(default_target: impl Into<String>) -> (Arc<Self>, bao_cdp::servo_bridge::BridgeReceiver) {
let (sender, receiver) = bridge_channel(UNDRAINED_TIMEOUT);
(
Arc::new(Self {
sender,
default_target: std::sync::Mutex::new(default_target.into()),
}),
receiver,
)
}
pub fn set_default_target(&self, target: impl Into<String>) {
*self.default_target.lock().unwrap() = target.into();
}
}
impl InMemoryBridge for MemoryCdpBridge {
fn dispatch_command(
&self,
method: &str,
params: serde_json::Value,
session_id: Option<&str>,
) -> InMemoryBridgeResponse {
let owned_default = self.default_target.lock().unwrap().clone();
let target = session_id.unwrap_or(&owned_default);
let msg = CdpMessage {
id: Some(0),
method: method.to_string(),
params: Some(params),
session_id: None,
};
let params_ref = msg.params.clone();
let response = handle_command(msg, target, ¶ms_ref, Some(&self.sender));
match response.error {
Some(err) => InMemoryBridgeResponse::Err(err.message),
None => InMemoryBridgeResponse::Ok(response.result.unwrap_or(serde_json::Value::Null)),
}
}
}