jamsocket_api/
lib.rs

1pub const API_BASE: &str = "https://beta.jamsocket.com/";
2pub const WS_BASE: &str = "wss://beta.jamsocket.com/";
3
4#[cfg(feature="client")]
5use anyhow::{anyhow, Result};
6#[cfg(feature="client")]
7use reqwest::StatusCode;
8use serde::{Serialize, Deserialize};
9
10#[cfg(feature="client")]
11pub struct JamsocketApi {
12    token: String,
13}
14
15#[cfg(feature="client")]
16impl JamsocketApi {
17    pub fn new(token: &str) -> Self {
18        JamsocketApi {
19            token: token.to_string(),
20        }
21    }
22
23    pub fn authenticate(&self) -> Result<Option<AuthcheckResponse>> {
24        let url = format!("{}authcheck", API_BASE);
25
26        let client = reqwest::blocking::Client::new();
27        let res = client.get(url).query(&[("token", &self.token)]).send()?;
28
29        if res.status().is_success() {
30            Ok(Some(res.json()?))
31        } else if res.status() == StatusCode::FORBIDDEN {
32            Ok(None)
33        } else {
34            Err(anyhow!("Unexpected error code: {}", res.status()))
35        }
36    }
37
38    pub fn upload(&self, service_id: &str, module: &[u8]) -> Result<UploadServiceResponse> {
39        let url = format!("{}service/{}/module", API_BASE, service_id);
40
41        let client = reqwest::blocking::Client::new();
42        let res = client
43            .post(url)
44            .query(&[("token", &self.token)])
45            .body(module.to_vec())
46            .send()?;
47
48        match res.status() {
49            StatusCode::NOT_FOUND => Err(anyhow!("service_id not found.")),
50            StatusCode::FORBIDDEN => Err(anyhow!(
51                "Configured token is not authorized for given service_id."
52            )),
53            StatusCode::OK => res.json::<UploadServiceResponse>().map_err(|e| e.into()),
54            sc => Err(anyhow!(
55                "Received error status code from jamsocket API: {} {:?}",
56                sc,
57                res.text()?
58            )),
59        }
60    }
61
62    pub fn new_service(&self) -> Result<String> {
63        let url = format!("{}service", API_BASE);
64
65        let client = reqwest::blocking::Client::new();
66        let res = client
67            .post(url)
68            .query(&[("token", &self.token)])
69            .body("")
70            .send()?;
71
72        match res.status() {
73            StatusCode::FORBIDDEN => Err(anyhow!(
74                "Configured token is not valid."
75            )),
76            StatusCode::OK => {
77                let response = res.json::<CreateServiceResponse>()?;
78                Ok(response.service_id.to_string())
79            },
80            sc => Err(anyhow!(
81                "Received error status code from jamsocket API: {} {:?}",
82                sc,
83                res.text()?
84            )),
85        }
86    }
87}
88
89#[derive(Serialize, Deserialize)]
90pub struct UploadServiceResponse {
91    pub module: String,
92    pub service: String,
93}
94
95#[derive(Serialize, Deserialize)]
96pub struct CreateServiceResponse {
97    pub service_id: String,
98}
99
100#[derive(Serialize, Deserialize)]
101pub struct AuthcheckResponse {
102    pub email: String,
103    pub provider: String,
104    pub username: String,
105    pub activated: bool,
106}