reifydb_runtime/actor/
context.rs1use std::{
13 sync::{
14 Arc,
15 atomic::{AtomicBool, Ordering},
16 },
17 time::Duration,
18};
19
20use crate::actor::{mailbox::ActorRef, system::ActorSystem, timers::TimerHandle};
21
22#[derive(Clone)]
26pub struct CancellationToken {
27 cancelled: Arc<AtomicBool>,
28}
29
30impl CancellationToken {
31 pub fn new() -> Self {
33 Self {
34 cancelled: Arc::new(AtomicBool::new(false)),
35 }
36 }
37
38 pub fn cancel(&self) {
40 self.cancelled.store(true, Ordering::SeqCst);
41 }
42
43 pub fn is_cancelled(&self) -> bool {
45 self.cancelled.load(Ordering::SeqCst)
46 }
47}
48
49impl Default for CancellationToken {
50 fn default() -> Self {
51 Self::new()
52 }
53}
54
55pub struct Context<M> {
62 self_ref: ActorRef<M>,
63 system: ActorSystem,
64 cancel: CancellationToken,
65}
66
67impl<M: Send + 'static> Context<M> {
68 pub(crate) fn new(self_ref: ActorRef<M>, system: ActorSystem, cancel: CancellationToken) -> Self {
70 Self {
71 self_ref,
72 system,
73 cancel,
74 }
75 }
76
77 pub fn self_ref(&self) -> ActorRef<M> {
79 self.self_ref.clone()
80 }
81
82 pub fn system(&self) -> &ActorSystem {
84 &self.system
85 }
86
87 pub fn is_cancelled(&self) -> bool {
89 self.cancel.is_cancelled()
90 }
91
92 pub fn cancellation_token(&self) -> CancellationToken {
94 self.cancel.clone()
95 }
96}
97
98impl<M: Send + 'static> Context<M> {
99 #[cfg(reifydb_target = "native")]
104 pub fn schedule_once<F: FnOnce() -> M + Send + 'static>(&self, delay: Duration, factory: F) -> TimerHandle {
105 let actor_ref = self.self_ref.clone();
106 self.system.scheduler().schedule_once(delay, move || {
107 let _ = actor_ref.send(factory());
108 })
109 }
110
111 #[cfg(reifydb_target = "wasm")]
116 pub fn schedule_once<F: FnOnce() -> M + Send + 'static>(&self, delay: Duration, factory: F) -> TimerHandle {
117 crate::actor::timers::wasm::schedule_once_fn(self.self_ref.clone(), delay, factory)
118 }
119}
120
121impl<M: Send + Sync + Clone + 'static> Context<M> {
122 #[cfg(reifydb_target = "native")]
127 pub fn schedule_repeat(&self, interval: Duration, msg: M) -> TimerHandle {
128 let actor_ref = self.self_ref.clone();
129 self.system.scheduler().schedule_repeat(interval, move || actor_ref.send(msg.clone()).is_ok())
130 }
131
132 #[cfg(reifydb_target = "wasm")]
137 pub fn schedule_repeat(&self, interval: Duration, msg: M) -> TimerHandle {
138 crate::actor::timers::wasm::schedule_repeat(self.self_ref.clone(), interval, msg)
139 }
140}
141
142impl<M> Clone for Context<M> {
143 fn clone(&self) -> Self {
144 Self {
145 self_ref: self.self_ref.clone(),
146 system: self.system.clone(),
147 cancel: self.cancel.clone(),
148 }
149 }
150}