pub struct InMemoryTransport { /* private fields */ }Expand description
InMemoryTransport — 跨线程同步 CDP 桥接 Transport 实现。
持有:
Arc<dyn InMemoryBridge>:命令派发(servo 端)event_rx:事件接收 channel(InMemoryBridge 侧 push,CDP client 侧 recv)event_tx:event_rx的 sender 克隆,作为构造时的“事件入口“接口servo_event_rx(可选):servo 7 类事件接收 channel(REQ-BAO-API-003)。 通过InMemoryTransport::attach_servo_event_receiver接入,recv_event会优先消费 servo 事件(translate 为 CDP event 后返回); 无 servo 事件时 fallback 到普通event_rx(供测试 mock 直接 push CDP event)。pending_cdp_events:servo 事件 translate 后可能产生多个 CDP event, 未返回的暂存在这里。
关闭语义:close() drop sender/receiver,后续命令返回 ConnectionClosed。
@trace REQ-BAO-API-002 [interface:Transport] @trace REQ-BAO-API-003 [interface:Transport]
Implementations§
Source§impl InMemoryTransport
impl InMemoryTransport
Sourcepub fn new(bridge: Arc<dyn InMemoryBridge>) -> InMemoryTransport
pub fn new(bridge: Arc<dyn InMemoryBridge>) -> InMemoryTransport
构造 InMemory transport,桥接到指定的 InMemoryBridge 实现。
TASK-2 内可传入 mock bridge 用于单元测试;TASK-3 内传入真实 servo bridge。
@trace REQ-BAO-API-002 [interface:Transport]
Sourcepub fn event_sender(&self) -> Sender<CdpEvent>
pub fn event_sender(&self) -> Sender<CdpEvent>
获取事件 sender 克隆 — 供 servo 端(InMemoryBridge 实现)向 CDP client 推送事件。
调用方(servo delegate)持有一份 sender,在 servo 触发事件时调用
event_sender.send(CdpEvent::new(...)) 即可被 recv_event() 收到。
@trace REQ-BAO-API-002 [interface:Transport]
Sourcepub fn attach_servo_event_receiver(&mut self, rx: Receiver<ServoEvent>)
pub fn attach_servo_event_receiver(&mut self, rx: Receiver<ServoEvent>)
接入 servo 事件 receiver(REQ-BAO-API-003)。
接入后,recv_event 会优先消费 servo 事件并经
crate::bridge::event_translator::translate 转换为 CDP event。
无 servo 事件时 fallback 到普通 event_rx(供测试直接 push CDP event)。
通常与 crate::bridge::EventSubscriber::new 配合使用:
use bao_cdp_client::bridge::{CDPRdpBridge, EventSubscriber, MockServoBackend, ServoBackend};
use bao_cdp_client::transport::{InMemoryBridge, InMemoryTransport};
use std::sync::Arc;
let backend: Arc<dyn ServoBackend> = Arc::new(MockServoBackend::new());
let bridge = CDPRdpBridge::new(backend);
let bridge_dyn: Arc<dyn InMemoryBridge> = bridge.into_in_memory_bridge();
let mut transport = InMemoryTransport::new(bridge_dyn);
let (subscriber, rx) = EventSubscriber::new();
transport.attach_servo_event_receiver(rx);
// 把 subscriber 注册到 servo delegate...
let _ = subscriber;@trace REQ-BAO-API-003 [interface:Transport]
Trait Implementations§
Source§impl Debug for InMemoryTransport
impl Debug for InMemoryTransport
Source§impl Transport for InMemoryTransport
impl Transport for InMemoryTransport
Source§fn kind(&self) -> TransportKind
fn kind(&self) -> TransportKind
Source§fn send_command(
&mut self,
method: &str,
params: Value,
session_id: Option<&str>,
) -> Result<Value, CdpError>
fn send_command( &mut self, method: &str, params: Value, session_id: Option<&str>, ) -> Result<Value, CdpError>
Source§fn recv_event(&mut self) -> Result<Option<CdpEvent>, CdpError>
fn recv_event(&mut self) -> Result<Option<CdpEvent>, CdpError>
Source§fn set_command_timeout(&mut self, timeout: Duration)
fn set_command_timeout(&mut self, timeout: Duration)
Source§fn set_event_timeout(&mut self, timeout: Duration)
fn set_event_timeout(&mut self, timeout: Duration)
Auto Trait Implementations§
impl !RefUnwindSafe for InMemoryTransport
impl !Sync for InMemoryTransport
impl !UnwindSafe for InMemoryTransport
impl Freeze for InMemoryTransport
impl Send for InMemoryTransport
impl Unpin for InMemoryTransport
impl UnsafeUnpin for InMemoryTransport
Blanket Implementations§
Source§impl<T> AsCtxPtr for Twhere
T: ?Sized,
impl<T> AsCtxPtr for Twhere
T: ?Sized,
Source§fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
fn as_ctx_ptr(&self) -> *mut Selfwhere
Self: Sized,
self’s address as *mut Self for deferred-task / scopeguard /
ref_guard ctx slots. The closures/trampolines deref it as shared
(&*p) — every method they reach is &self post-R-2, so no write
provenance is required; the *mut spelling is purely to match the
existing DerefOnDrop / HasAutoFlush / RefCount ABI.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more