Skip to main content

ek_core/
lib.rs

1//! ek-core —— 插件宿主 + Actor-over-Bus 运行时(基于已发布的 ek-event 0.1.0)。
2//!
3//! 核心协议:
4//! - **收** = 插件唯一入口 [`Plugin::on_mail`](plugin::Plugin);订阅面由 [`Plugin::routes`] 声明,
5//!   宿主 start() 时为每条 route 装配 forwarder(**无界邮箱 + 深度计数**,零阻塞)。
6//! - **发** = 插件唯一出口 [`PluginContext`](context::PluginContext):`put`(广播/业务日志)、
7//!   `ask`(eReq+Oneshot 请求)、`notify`(eTo)。
8//! - 宿主不执行业务、零业务类型、零日志(0.3.0):插件之间不直调;
9//!   依赖在 add_plugin 时显式声明,start 按 deps 拓扑序装配,close 按逆序五步回收。
10//! - 宿主想说的话全是结构化事件:`ePlugUp`/`ePlugDown`/`ePlugQDown.<名>`/`eSrvChg`
11//!   (见 [`lifecycle`]);运维诊断文本只走 stderr,不进总线不占类型。
12//!   业务日志与本宿主无关(插件自造自投,业务链上用 ek-data 的 LogData 到 "eLog")。
13//!
14//! 故障面:handler panic 由 worker catch_unwind 隔离,连续 [`PANIC_LIMIT`] 次 → Quarantined
15//! (worker 自退 + `ePlugQDown.<name>` 结构化广播)。
16//!
17//! 邮箱背压(0.5.0 口径反转,D5 改案):邮箱**无界** → 业务事实默认**不丢**;
18//! 深度实时可见(`mail_stats().pending/peak`),**只有到软顶 [`MAILBOX_SOFT_CAP`] 才丢**
19//! (丢新帧 + `stats.spilled` 计数 + 节流 stderr)。无界 ≠ 无限:软顶就是"不丢"的兜底出口。
20
21pub mod audit;
22pub mod cfg_face;
23pub mod context;
24pub mod envelope;
25pub mod error;
26mod forwarder;
27pub mod lifecycle;
28pub mod main_engine;
29pub mod plugin;
30pub mod registry;
31pub mod section;
32pub mod service;
33pub mod worker;
34
35pub use cfg_face::{CfgHost, ConfigField, ConfigKind, ConfigView, view_of};
36pub use context::PluginContext;
37pub use envelope::{
38    Envelope, OneshotErr, OneshotReceiver, OneshotSender, ReplyErr, e_req_type, e_to_type,
39};
40pub use error::{AskError, PluginError};
41pub use lifecycle::{
42    EVENT_PLUG_DOWN, EVENT_PLUG_DOWN_EVENT_PREFIX, EVENT_PLUG_DOWN_PREFIX, EVENT_PLUG_UP,
43    EVENT_PLUG_UP_PREFIX, EVENT_SRV_CHG, EVENT_SRV_CHG_PREFIX,
44};
45pub use main_engine::{MailStats, MainEngine, PluginInfo, PluginState};
46pub use plugin::{MAILBOX_SOFT_CAP, PANIC_LIMIT, Plugin};
47pub use section::{ApplyReport, Configurable, Field, SectionMap, valid_config_ns};
48pub use service::{PlugNotice, ProviderRef, ServiceDesc};