taubyte_sdk/pubsub/node/
socket.rs1use 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}