1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//! `Plugin` trait —— 插件实现的唯一契约(业务与宿主的边界)。
//!
//! 纪律(写进 doc,实施由宿主强制):
//! - 收:只有 [`Plugin::on_mail`] 一个入口;订阅面由 [`Plugin::routes`] 静态声明,
//! 宿主 start() 时统一装配 forwarder(v0.1 不支持运行期动态订阅)。
//! - 发:只有 [`PluginContext`](crate::PluginContext) 三个出口(put/ask/notify);
//! 业务日志属 put 的用例(0.3.0:宿主零日志,无 write_log 出口)。
//! - 状态:插件状态放对象内部自锁(`Mutex/RwLock`);on_mail 在插件 worker 线程串行执行。
//! - 停:on_stop 之后不再收到任何邮件(close 五步第②步)。
use cratePluginContext;
use crateServiceDesc;
use Any;
use Cow;
use Duration;
use Event;
/// 邮箱**软顶**(D5 改案,0.5.0):缺省 262144,`mailbox_soft_cap()` 按插件覆写。
///
/// 口径(与 0.4 的"有界邮箱满即丢"是**一次口径反转**):
/// - 邮箱**无界**——业务事实(委托/成交/持仓/资金/状态/ask 信封)默认**不丢**;
/// - 深度实时计数(`mail_stats().pending`/`peak`)常年在统计面可见,越阈告警归消费侧;
/// - **只有到软顶才丢**(丢新帧 + 计数 + 立刻诊断):这是"不丢"的唯一出口,
/// 目的是不让慢消费者把进程吃挂(无界 ≠ 无限);
/// - 旧 `MAILBOX_CAP`(1024,有界即丢)退役:链上没有任何插件依赖"到顶丢事件"这个语义。
pub const MAILBOX_SOFT_CAP: u64 = 262_144;
/// 连续 panic 熔断阈值(D3)。
pub const PANIC_LIMIT: u32 = 3;
/// 插件名规则(D2):首字母字母,其余 alnum/_/-,长度 1..=32。
/// close() 的 join 等待上限(D4:超时告警不死等)。
pub const CLOSE_JOIN_TIMEOUT: Duration = from_secs;