taubyte_sdk/pubsub/node/
socket.rs

1use super::{imports, Channel, WebSocket};
2use crate::errno::Error;
3
4impl Channel {
5    pub fn web_socket(&self) -> WebSocket {
6        WebSocket { name: self.name() }
7    }
8}
9
10impl WebSocket {
11    pub fn url_size_unsafe(&self, size: *mut usize) -> Error {
12        #[allow(unused_unsafe)]
13        unsafe {
14            imports::getWebSocketURLSize(self.name.as_ptr(), self.name.len(), size)
15        }
16    }
17
18    pub fn url_unsafe(&self, buf_ptr: *mut u8) -> Error {
19        #[allow(unused_unsafe)]
20        unsafe {
21            imports::getWebSocketURL(self.name.as_ptr(), self.name.len(), buf_ptr)
22        }
23    }
24
25    pub fn url(&self) -> Result<String, Box<dyn std::error::Error>> {
26        let mut size: usize = 0;
27        let err0 = self.url_size_unsafe(&mut size);
28        if err0.is_err() {
29            return Err(format!(
30                "Getting url size for channel: `{}` failed with: {}",
31                self.name, err0
32            )
33            .into());
34        }
35        if size == 0 {
36            return Ok(String::new());
37        }
38
39        let mut buf = vec![0u8; size];
40        let err0 = self.url_unsafe(buf.as_mut_ptr());
41        if err0.is_err() {
42            Err(format!(
43                "Getting url for channel: `{}` failed with: {}",
44                self.name, err0
45            )
46            .into())
47        } else {
48            Ok(String::from_utf8(buf)?)
49        }
50    }
51}
52
53#[cfg(test)]
54pub mod test {
55    use crate::pubsub::Channel;
56    pub static NAME: &str = "testChannel";
57    pub static URL: &str = "testUrl";
58
59    #[test]
60    fn web_socket() {
61        let channel = Channel::new(NAME.to_string()).unwrap();
62        let web_socket = channel.web_socket();
63        assert_eq!(web_socket.name(), NAME);
64
65        let url = web_socket.url().unwrap();
66        assert_eq!(url, URL);
67    }
68}
69
70#[cfg(test)]
71#[allow(non_snake_case)]
72pub mod mock {
73    use super::test;
74    use crate::{
75        errno::{Errno, Error},
76        utils::test as utils,
77    };
78
79    pub fn getWebSocketURLSize(name_ptr: *const u8, name_size: usize, size: *mut usize) -> Error {
80        let name = utils::read_string(name_ptr, name_size);
81
82        if name != test::NAME {
83            Errno::ErrorCap.error()
84        } else {
85            utils::write_usize(size, test::URL.len());
86            Errno::ErrorNone.error()
87        }
88    }
89
90    pub fn getWebSocketURL(name_ptr: *const u8, name_size: usize, buf_ptr: *mut u8) -> Error {
91        let name = utils::read_string(name_ptr, name_size);
92
93        if name != test::NAME {
94            Errno::ErrorCap.error()
95        } else {
96            utils::write_string(buf_ptr, test::URL);
97            Errno::ErrorNone.error()
98        }
99    }
100}