helix_core/effect/ids.rs
1use bytes::Bytes;
2
3/// 不透明令牌:把 `Effect::Persist` / `Effect::Http` 与未来的 `Tick::PortReply` 配对。
4///
5/// `ExecutionShell` 维护 `Correlation → module_index` 映射(`corr_map`),
6/// 保证 PortReply 定向投递给发出该 Correlation 的模块(审查意见2 P3 落实)。
7///
8/// ## MIN-1 修复
9///
10/// 内部值改为 `pub(crate)` — 外部 crate 通过 `raw()` 只读访问,
11/// 只有 engine 的 `CorrelationSource` 可以创建新值,保证"ID 由分配器单调发放"不变量。
12/// helix-im 通过 `ImModule::alloc_corr()` 获取(`helix_core::Correlation::new_from_raw`
13/// 是 pub(crate) 构造器,只对 helix-core 自身可见)。
14///
15/// 由于 helix-im 是独立 crate,需要分配 Correlation,保留一个 `pub` 的 `from_raw`
16/// 构造器(但语义上调用方应通过模块内的 IdAllocator 管理,不得随意构造)。
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18pub struct Correlation(pub(crate) u64);
19
20impl Correlation {
21 /// 从原始 u64 构造(供 helix-im 等业务 crate 的 IdAllocator 使用)。
22 ///
23 /// 调用方负责保证全局单调唯一性;不得在 ID 分配器之外随意调用。
24 pub fn from_raw(v: u64) -> Self {
25 Self(v)
26 }
27
28 /// 获取内部原始值(只读)
29 pub fn raw(self) -> u64 {
30 self.0
31 }
32}
33
34/// 不透明定时器 ID:把 `Effect::ScheduleTimer` 与未来的 `Tick::Timer` 配对。
35#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
36pub struct TimerId(pub(crate) u64);
37
38impl TimerId {
39 /// 从原始 u64 构造(供业务 crate 的 IdAllocator 使用)
40 pub fn from_raw(v: u64) -> Self {
41 Self(v)
42 }
43
44 /// 获取内部原始值(只读)
45 pub fn raw(self) -> u64 {
46 self.0
47 }
48}
49
50/// 传输通道 ID(模块可管理多个 transport,如 WS + debug transport)
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
52pub struct TransportId(pub(crate) u32);
53
54impl TransportId {
55 pub fn from_raw(v: u32) -> Self {
56 Self(v)
57 }
58
59 pub fn raw(self) -> u32 {
60 self.0
61 }
62}
63
64/// 零拷贝事件字节。`bytes::Bytes` 引用计数,clone = O(1)。
65/// core 不解析内容,只搬运已序列化的字节。
66#[derive(Debug, Clone)]
67pub struct DomainEventBytes(pub Bytes);