Skip to main content

mini_chat/infra/plugins/static_audit/
gear.rs

1use std::sync::{Arc, OnceLock};
2
3use async_trait::async_trait;
4use toolkit::Gear;
5use toolkit::client_hub::ClientScope;
6use toolkit::context::GearCtx;
7use toolkit::gts::PluginV1;
8use tracing::info;
9use types_registry_sdk::{RegisterResult, TypesRegistryClient};
10
11use mini_chat_sdk::{MiniChatAuditPluginClientV1, MiniChatAuditPluginSpecV1};
12
13use super::config::StaticMiniChatAuditPluginConfig;
14use super::service::Service;
15
16/// Static audit plugin gear for mini-chat.
17///
18/// Logs all audit events via `tracing` for development and testing.
19/// When `enabled: false` in config, the plugin registers normally but
20/// all emit methods return immediately without logging.
21#[toolkit::gear(
22    name = "static-mini-chat-audit-plugin",
23    deps = [types_registry]
24)]
25pub struct StaticMiniChatAuditPlugin {
26    service: OnceLock<Arc<Service>>,
27}
28
29impl Default for StaticMiniChatAuditPlugin {
30    fn default() -> Self {
31        Self {
32            service: OnceLock::new(),
33        }
34    }
35}
36
37#[async_trait]
38impl Gear for StaticMiniChatAuditPlugin {
39    async fn init(&self, ctx: &GearCtx) -> anyhow::Result<()> {
40        let cfg: StaticMiniChatAuditPluginConfig = ctx.config_or_default()?;
41        info!(
42            enabled = cfg.enabled,
43            vendor = %cfg.vendor,
44            priority = cfg.priority,
45            "Loaded static mini-chat audit plugin configuration"
46        );
47
48        let service = Arc::new(Service {
49            enabled: cfg.enabled,
50        });
51        self.service
52            .set(service.clone())
53            .map_err(|_| anyhow::anyhow!("{} gear already initialized", Self::MODULE_NAME))?;
54
55        // Build registration payload and instance id for this plugin.
56        let (instance_id, instance_json) =
57            PluginV1::<MiniChatAuditPluginSpecV1>::build_registration(
58                "cf.core._.static_mini_chat_audit.v1",
59                &cfg.vendor,
60                cfg.priority,
61            )?;
62
63        // Publish to types-registry.
64        let registry = ctx.client_hub().get::<dyn TypesRegistryClient>()?;
65        let results = registry.register(vec![instance_json]).await?;
66        RegisterResult::ensure_all_ok(&results)?;
67
68        let api: Arc<dyn MiniChatAuditPluginClientV1> = service;
69        ctx.client_hub()
70            .register_scoped::<dyn MiniChatAuditPluginClientV1>(
71                ClientScope::gts_id(&instance_id),
72                api,
73            );
74
75        info!(instance_id = %instance_id, "Static mini-chat audit plugin registered");
76        Ok(())
77    }
78}