Skip to main content

atomr_remote/
provider.rs

1//! `RemoteActorRefProvider`. akka.net: `Remote/RemoteActorRefProvider.cs`.
2//!
3//! Plug-in for `atomr_core::ActorSystem` that resolves
4//! `akka.tcp://...`-style paths into `RemoteActorRefImpl` handles.
5
6use std::sync::Arc;
7
8use atomr_core::actor::{ActorPath, ActorSystem, Address, RemoteProvider, RemoteRef};
9
10use crate::endpoint_manager::EndpointManager;
11use crate::remote_ref::RemoteActorRefImpl;
12use crate::serialization::SerializerRegistry;
13use crate::system_daemon::RemoteSystemDaemon;
14
15/// Per-system remote provider. Created by `enable_remote`.
16pub struct RemoteActorRefProvider {
17    local_address: Address,
18    local_uid: u64,
19    endpoint_manager: EndpointManager,
20    registry: SerializerRegistry,
21    pub system_daemon: Arc<RemoteSystemDaemon>,
22}
23
24impl RemoteActorRefProvider {
25    pub fn new(
26        local_address: Address,
27        local_uid: u64,
28        endpoint_manager: EndpointManager,
29        registry: SerializerRegistry,
30        system_daemon: Arc<RemoteSystemDaemon>,
31    ) -> Arc<Self> {
32        Arc::new(Self { local_address, local_uid, endpoint_manager, registry, system_daemon })
33    }
34
35    pub fn endpoint_manager(&self) -> &EndpointManager {
36        &self.endpoint_manager
37    }
38
39    pub fn registry(&self) -> &SerializerRegistry {
40        &self.registry
41    }
42
43    /// Install on an `ActorSystem` so `actor_selection` resolves remote paths.
44    pub fn install(self: &Arc<Self>, system: &ActorSystem) {
45        let p: Arc<dyn RemoteProvider> = self.clone();
46        system.set_remote_provider(p);
47    }
48}
49
50impl RemoteProvider for RemoteActorRefProvider {
51    fn local_address(&self) -> &Address {
52        &self.local_address
53    }
54
55    fn resolve(&self, path: &ActorPath) -> Option<Arc<dyn RemoteRef>> {
56        if path.address == self.local_address {
57            return None;
58        }
59        let r = RemoteActorRefImpl::new(
60            path.clone(),
61            self.endpoint_manager.clone(),
62            self.registry.clone(),
63            self.local_uid,
64        );
65        Some(Arc::new(r))
66    }
67}