Skip to main content

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);