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}