ringkernel_accnet/actors/
messages.rs1use ringkernel_core::message::{CorrelationId, MessageId, Priority};
6use ringkernel_derive::RingMessage;
7
8#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
10#[message(type_id = 100)]
11pub struct FlowGenerationRequest {
12 #[message(id)]
14 pub id: MessageId,
15 pub batch_id: u64,
17 pub entry_count: u32,
19 pub data_offset: u64,
21}
22
23#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
25#[message(type_id = 101)]
26pub struct FlowGenerationResponse {
27 #[message(id)]
29 pub id: MessageId,
30 #[message(correlation)]
32 pub correlation_id: CorrelationId,
33 pub batch_id: u64,
35 pub flow_count: u32,
37 pub data_offset: u64,
39}
40
41#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
43#[message(type_id = 200)]
44pub struct PageRankRequest {
45 #[message(id)]
47 pub id: MessageId,
48 pub account_count: u32,
50 pub edge_count: u32,
52 pub damping: f32,
54 pub iterations: u32,
56 pub graph_offset: u64,
58}
59
60#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
62#[message(type_id = 201)]
63pub struct PageRankResponse {
64 #[message(id)]
66 pub id: MessageId,
67 #[message(correlation)]
69 pub correlation_id: CorrelationId,
70 pub scores_offset: u64,
72 pub converged: bool,
74 pub iterations_run: u32,
76}
77
78#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
80#[message(type_id = 300)]
81pub struct FraudDetectionRequest {
82 #[message(id)]
84 pub id: MessageId,
85 #[message(priority)]
87 pub priority: Priority,
88 pub snapshot_id: u64,
90 pub flow_count: u32,
92 pub flows_offset: u64,
94 pub accounts_offset: u64,
96 pub account_count: u32,
98}
99
100#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
102#[message(type_id = 301)]
103pub struct FraudDetectionResponse {
104 #[message(id)]
106 pub id: MessageId,
107 #[message(correlation)]
109 pub correlation_id: CorrelationId,
110 pub pattern_count: u32,
112 pub patterns_offset: u64,
114 pub risk_score: f32,
116}
117
118#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
120#[message(type_id = 400)]
121pub struct GaapValidationRequest {
122 #[message(id)]
124 pub id: MessageId,
125 pub flow_count: u32,
127 pub flows_offset: u64,
129 pub account_types_offset: u64,
131}
132
133#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
135#[message(type_id = 401)]
136pub struct GaapValidationResponse {
137 #[message(id)]
139 pub id: MessageId,
140 #[message(correlation)]
142 pub correlation_id: CorrelationId,
143 pub violation_count: u32,
145 pub violations_offset: u64,
147}
148
149#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
151#[message(type_id = 500)]
152pub struct BenfordAnalysisRequest {
153 #[message(id)]
155 pub id: MessageId,
156 pub amount_count: u32,
158 pub amounts_offset: u64,
160}
161
162#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
164#[message(type_id = 501)]
165pub struct BenfordAnalysisResponse {
166 #[message(id)]
168 pub id: MessageId,
169 #[message(correlation)]
171 pub correlation_id: CorrelationId,
172 pub digit_counts: [u32; 9],
174 pub chi_squared: f32,
176 pub is_anomalous: bool,
178}
179
180#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
182#[message(type_id = 600)]
183pub struct SuspenseDetectionRequest {
184 #[message(id)]
186 pub id: MessageId,
187 pub account_count: u32,
189 pub balances_offset: u64,
191 pub risk_scores_offset: u64,
193 pub flow_counts_offset: u64,
195}
196
197#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
199#[message(type_id = 601)]
200pub struct SuspenseDetectionResponse {
201 #[message(id)]
203 pub id: MessageId,
204 #[message(correlation)]
206 pub correlation_id: CorrelationId,
207 pub suspense_count: u32,
209 pub scores_offset: u64,
211}
212
213#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
215#[message(type_id = 900)]
216pub struct AnalyticsResult {
217 #[message(id)]
219 pub id: MessageId,
220 pub snapshot_id: u64,
222 pub pagerank_complete: bool,
224 pub fraud_detection_complete: bool,
226 pub gaap_validation_complete: bool,
228 pub benford_complete: bool,
230 pub fraud_pattern_count: u32,
232 pub gaap_violation_count: u32,
234 pub suspense_account_count: u32,
236 pub overall_risk_score: f32,
238 pub benford_anomaly: bool,
240 pub processing_time_us: u64,
242}
243
244#[derive(Debug, Clone, RingMessage, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
246#[message(type_id = 999)]
247pub struct ShutdownCommand {
248 #[message(id)]
250 pub id: MessageId,
251 pub reason: u32, }
254
255#[cfg(test)]
256mod tests {
257 use super::*;
258
259 #[test]
260 fn test_message_serialization() {
261 let request = FlowGenerationRequest {
262 id: MessageId::generate(),
263 batch_id: 42,
264 entry_count: 100,
265 data_offset: 0x1000,
266 };
267
268 assert_eq!(request.batch_id, 42);
270 assert_eq!(request.entry_count, 100);
271 }
272
273 #[test]
274 fn test_pagerank_request() {
275 let request = PageRankRequest {
276 id: MessageId::generate(),
277 account_count: 50,
278 edge_count: 200,
279 damping: 0.85,
280 iterations: 20,
281 graph_offset: 0,
282 };
283
284 assert_eq!(request.damping, 0.85);
285 assert_eq!(request.iterations, 20);
286 }
287}