naia_shared/world/delegation/
auth_channel.rs1use std::sync::{Arc, RwLock};
2
3use crate::{
4 world::delegation::entity_auth_status::{EntityAuthStatus, HostEntityAuthStatus},
5 HostType,
6};
7
8#[derive(Clone)]
10pub(crate) struct EntityAuthChannel {
11 data: Arc<RwLock<EntityAuthData>>,
12}
13
14impl EntityAuthChannel {
15 pub(crate) fn new_channel(host_type: HostType) -> (EntityAuthMutator, EntityAuthAccessor) {
16 let channel = Self {
17 data: Arc::new(RwLock::new(EntityAuthData::new(host_type))),
18 };
19
20 let sender = EntityAuthMutator::new(&channel);
21 let receiver = EntityAuthAccessor::new(&channel);
22
23 (sender, receiver)
24 }
25
26 fn auth_status(&self) -> HostEntityAuthStatus {
27 let data = self
28 .data
29 .as_ref()
30 .read()
31 .expect("Lock on AuthStatus is held by current thread.");
32 return data.auth_status();
33 }
34
35 fn set_auth_status(&self, auth_status: EntityAuthStatus) {
36 let mut data = self
37 .data
38 .as_ref()
39 .write()
40 .expect("Lock on AuthStatus is held by current thread.");
41 data.set_auth_status(auth_status);
42 }
43}
44
45struct EntityAuthData {
47 host_type: HostType,
48 status: EntityAuthStatus,
49}
50
51impl EntityAuthData {
52 fn new(host_type: HostType) -> Self {
53 let status = match host_type {
54 HostType::Server => EntityAuthStatus::Available,
55 HostType::Client => EntityAuthStatus::Requested,
56 };
57 Self { host_type, status }
58 }
59
60 fn auth_status(&self) -> HostEntityAuthStatus {
61 HostEntityAuthStatus::new(self.host_type, self.status)
62 }
63
64 fn set_auth_status(&mut self, auth_status: EntityAuthStatus) {
65 self.status = auth_status;
66 }
67}
68
69#[derive(Clone)]
71pub struct EntityAuthAccessor {
72 channel: EntityAuthChannel,
73}
74
75impl EntityAuthAccessor {
76 fn new(channel: &EntityAuthChannel) -> Self {
77 Self {
78 channel: channel.clone(),
79 }
80 }
81
82 pub(crate) fn auth_status(&self) -> HostEntityAuthStatus {
83 self.channel.auth_status()
84 }
85}
86
87pub(crate) struct EntityAuthMutator {
90 channel: EntityAuthChannel,
91}
92
93impl EntityAuthMutator {
94 fn new(channel: &EntityAuthChannel) -> Self {
95 Self {
96 channel: channel.clone(),
97 }
98 }
99
100 pub(crate) fn set_auth_status(&self, auth_status: EntityAuthStatus) {
101 self.channel.set_auth_status(auth_status);
102 }
103}