pub struct InternalHookRegistry { /* private fields */ }Expand description
内部钩子注册表
管理事件与处理器的映射关系。支持按事件键(type:action)或
事件类型(type)注册处理器。
§线程安全
使用 RwLock 保护内部数据结构,支持多线程并发访问。
§事件键格式
| 注册方式 | 事件键示例 | 触发条件 |
|---|---|---|
| 类型级别 | agent | 所有 Agent 事件 |
| 动作级别 | agent:start | 仅 Agent Start 事件 |
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookHandlerFn};
use std::sync::Arc;
let registry = InternalHookRegistry::new();
// 注册处理器
let handler: InternalHookHandlerFn = Arc::new(|event| {
Box::pin(async move {
println!("Event: {}", event.event_key());
Ok(())
})
});
registry.register("agent:start", handler);
// 查询已注册的事件键
let keys = registry.get_registered_keys();
assert!(keys.contains(&"agent:start".to_string()));Implementations§
Source§impl InternalHookRegistry
impl InternalHookRegistry
Sourcepub fn register(&self, event_key: &str, handler: InternalHookHandlerFn)
pub fn register(&self, event_key: &str, handler: InternalHookHandlerFn)
注册处理器
将处理器注册到指定的事件键。支持两种注册方式:
- 类型级别:使用事件类型作为键(如
"agent"),匹配该类型的所有事件 - 动作级别:使用
type:action格式(如"agent:start"),匹配特定事件
同一事件键可以注册多个处理器,按注册顺序调用。
§参数
event_key: 事件键,可以是类型(如"agent")或type:action格式handler: 处理器函数
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookHandlerFn};
use std::sync::Arc;
let registry = InternalHookRegistry::new();
// 注册类型级别处理器(匹配所有 Agent 事件)
let type_handler: InternalHookHandlerFn = Arc::new(|_| Box::pin(async { Ok(()) }));
registry.register("agent", type_handler);
// 注册动作级别处理器(仅匹配 agent:start 事件)
let action_handler: InternalHookHandlerFn = Arc::new(|_| Box::pin(async { Ok(()) }));
registry.register("agent:start", action_handler);Sourcepub fn unregister(
&self,
event_key: &str,
handler: &InternalHookHandlerFn,
) -> bool
pub fn unregister( &self, event_key: &str, handler: &InternalHookHandlerFn, ) -> bool
取消注册处理器
从指定事件键中移除处理器。使用 Arc::ptr_eq 比较处理器指针。
§参数
event_key: 事件键handler: 要移除的处理器
§返回值
true: 成功移除处理器false: 未找到匹配的处理器
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookHandlerFn};
use std::sync::Arc;
let registry = InternalHookRegistry::new();
let handler: InternalHookHandlerFn = Arc::new(|_| Box::pin(async { Ok(()) }));
registry.register("agent:start", handler.clone());
// 取消注册
let removed = registry.unregister("agent:start", &handler);
assert!(removed);
// 再次取消注册返回 false
let removed_again = registry.unregister("agent:start", &handler);
assert!(!removed_again);Sourcepub fn clear(&self)
pub fn clear(&self)
清除所有处理器
移除注册表中的所有处理器和事件键。
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookHandlerFn};
use std::sync::Arc;
let registry = InternalHookRegistry::new();
let handler: InternalHookHandlerFn = Arc::new(|_| Box::pin(async { Ok(()) }));
registry.register("agent:start", handler.clone());
registry.register("session:create", handler);
assert_eq!(registry.get_registered_keys().len(), 2);
registry.clear();
assert!(registry.get_registered_keys().is_empty());Sourcepub fn get_registered_keys(&self) -> Vec<String>
pub fn get_registered_keys(&self) -> Vec<String>
获取已注册的事件键
返回所有已注册处理器的事件键列表。
§返回值
事件键列表,顺序不保证。
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookHandlerFn};
use std::sync::Arc;
let registry = InternalHookRegistry::new();
let handler: InternalHookHandlerFn = Arc::new(|_| Box::pin(async { Ok(()) }));
registry.register("agent:start", handler.clone());
registry.register("agent:stop", handler.clone());
registry.register("session:create", handler);
let keys = registry.get_registered_keys();
assert_eq!(keys.len(), 3);
assert!(keys.contains(&"agent:start".to_string()));
assert!(keys.contains(&"agent:stop".to_string()));
assert!(keys.contains(&"session:create".to_string()));Sourcepub fn get_handlers(&self, event_key: &str) -> Vec<InternalHookHandlerFn> ⓘ
pub fn get_handlers(&self, event_key: &str) -> Vec<InternalHookHandlerFn> ⓘ
Sourcepub async fn trigger(&self, event: &mut InternalHookEvent) -> Result<()>
pub async fn trigger(&self, event: &mut InternalHookEvent) -> Result<()>
触发事件
先调用类型级别处理器(如 "agent"),再调用动作级别处理器(如 "agent:start")。
处理器错误会被捕获并记录日志,不影响其他处理器执行。
§执行顺序
- 获取类型级别处理器(使用
event.event_type.to_string()作为键) - 获取动作级别处理器(使用
event.event_key()作为键) - 按注册顺序依次调用所有处理器
§错误处理
- 处理器返回
Err: 记录错误日志,继续执行下一个处理器 - 处理器超时: 记录警告日志,继续执行下一个处理器
§参数
event: 可变的事件引用,处理器可以修改事件的messages字段
§返回值
始终返回 Ok(()),处理器错误不会导致整体失败。
§示例
ⓘ
use aster::hooks::internal::{InternalHookRegistry, InternalHookEvent, InternalHookEventType, InternalHookAction, InternalHookHandlerFn};
use std::sync::Arc;
use serde_json::json;
let registry = InternalHookRegistry::new();
// 注册类型级别处理器
let type_handler: InternalHookHandlerFn = Arc::new(|event| {
Box::pin(async move {
event.messages.push("Type handler called".to_string());
Ok(())
})
});
registry.register("agent", type_handler);
// 注册动作级别处理器
let action_handler: InternalHookHandlerFn = Arc::new(|event| {
Box::pin(async move {
event.messages.push("Action handler called".to_string());
Ok(())
})
});
registry.register("agent:start", action_handler);
// 触发事件
let mut event = InternalHookEvent::new(
InternalHookEventType::Agent,
InternalHookAction::Start,
None,
json!({}),
);
// 在异步上下文中调用
// registry.trigger(&mut event).await.unwrap();
// assert_eq!(event.messages, vec!["Type handler called", "Action handler called"]);Sourcepub fn handler_count(&self) -> usize
pub fn handler_count(&self) -> usize
Trait Implementations§
Source§impl Debug for InternalHookRegistry
impl Debug for InternalHookRegistry
Auto Trait Implementations§
impl !Freeze for InternalHookRegistry
impl !RefUnwindSafe for InternalHookRegistry
impl Send for InternalHookRegistry
impl Sync for InternalHookRegistry
impl Unpin for InternalHookRegistry
impl UnsafeUnpin for InternalHookRegistry
impl !UnwindSafe for InternalHookRegistry
Blanket Implementations§
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
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
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>
Converts
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>
Converts
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestCreates a shared type from an unshared type.
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref() only in debug builds, and is erased in release
builds.