Merge pull request #123 from polyphony-chat/refactor/reuse-reqwest-client
Refactor/reuse reqwest client
This commit is contained in:
commit
82573a58b1
|
@ -26,7 +26,7 @@ impl Instance {
|
||||||
let response = LimitedRequester::send_request(
|
let response = LimitedRequester::send_request(
|
||||||
request_builder,
|
request_builder,
|
||||||
LimitType::AuthRegister,
|
LimitType::AuthRegister,
|
||||||
&mut self.limits,
|
self,
|
||||||
&mut cloned_limits,
|
&mut cloned_limits,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
|
@ -12,13 +12,15 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
impl Instance {
|
impl Instance {
|
||||||
/**
|
/// Registers a new user on the Spacebar server.
|
||||||
Registers a new user on the Spacebar server.
|
///
|
||||||
# Arguments
|
/// # Arguments
|
||||||
* `register_schema` - The [`RegisterSchema`] that contains all the information that is needed to register a new user.
|
///
|
||||||
# Errors
|
/// * `register_schema` - The [`RegisterSchema`] that contains all the information that is needed to register a new user.
|
||||||
* [`ChorusLibError`] - If the server does not respond.
|
///
|
||||||
*/
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// * [`ChorusLibError`] - If the server does not respond.
|
||||||
pub async fn register_account(
|
pub async fn register_account(
|
||||||
&mut self,
|
&mut self,
|
||||||
register_schema: &RegisterSchema,
|
register_schema: &RegisterSchema,
|
||||||
|
@ -34,7 +36,7 @@ impl Instance {
|
||||||
let response = LimitedRequester::send_request(
|
let response = LimitedRequester::send_request(
|
||||||
request_builder,
|
request_builder,
|
||||||
LimitType::AuthRegister,
|
LimitType::AuthRegister,
|
||||||
&mut self.limits,
|
self,
|
||||||
&mut cloned_limits,
|
&mut cloned_limits,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
@ -59,7 +61,7 @@ impl Instance {
|
||||||
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
|
return Err(ChorusLibError::InvalidFormBodyError { error_type, error });
|
||||||
}
|
}
|
||||||
let user_object = self.get_user(token.clone(), None).await.unwrap();
|
let user_object = self.get_user(token.clone(), None).await.unwrap();
|
||||||
let settings = UserMeta::get_settings(&token, &self.urls.api, &mut self.limits)
|
let settings = UserMeta::get_settings(&token, &self.urls.api.clone(), self)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let user = UserMeta::new(
|
let user = UserMeta::new(
|
||||||
|
|
|
@ -15,7 +15,7 @@ pub async fn handle_request(
|
||||||
LimitedRequester::send_request(
|
LimitedRequester::send_request(
|
||||||
request,
|
request,
|
||||||
limit_type,
|
limit_type,
|
||||||
&mut user.belongs_to.borrow_mut().limits,
|
&mut user.belongs_to.borrow_mut(),
|
||||||
&mut user.limits,
|
&mut user.limits,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -7,6 +7,7 @@ use crate::api::handle_request;
|
||||||
use crate::api::handle_request_as_result;
|
use crate::api::handle_request_as_result;
|
||||||
use crate::api::limits::Limits;
|
use crate::api::limits::Limits;
|
||||||
use crate::errors::ChorusLibError;
|
use crate::errors::ChorusLibError;
|
||||||
|
use crate::instance::Instance;
|
||||||
use crate::instance::UserMeta;
|
use crate::instance::UserMeta;
|
||||||
use crate::limit::LimitedRequester;
|
use crate::limit::LimitedRequester;
|
||||||
use crate::types::{Channel, ChannelCreateSchema, Guild, GuildCreateSchema};
|
use crate::types::{Channel, ChannelCreateSchema, Guild, GuildCreateSchema};
|
||||||
|
@ -101,7 +102,7 @@ impl Guild {
|
||||||
&self.id.to_string(),
|
&self.id.to_string(),
|
||||||
schema,
|
schema,
|
||||||
&mut user.limits,
|
&mut user.limits,
|
||||||
&mut belongs_to.limits,
|
&mut belongs_to,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -161,7 +162,7 @@ impl Guild {
|
||||||
guild_id,
|
guild_id,
|
||||||
&user.token,
|
&user.token,
|
||||||
&mut user.limits,
|
&mut user.limits,
|
||||||
&mut belongs_to.limits,
|
&mut belongs_to,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -173,7 +174,7 @@ impl Guild {
|
||||||
guild_id: &str,
|
guild_id: &str,
|
||||||
token: &str,
|
token: &str,
|
||||||
limits_user: &mut Limits,
|
limits_user: &mut Limits,
|
||||||
limits_instance: &mut Limits,
|
instance: &mut Instance,
|
||||||
) -> Result<Guild, ChorusLibError> {
|
) -> Result<Guild, ChorusLibError> {
|
||||||
let request = Client::new()
|
let request = Client::new()
|
||||||
.get(format!("{}/guilds/{}/", url_api, guild_id))
|
.get(format!("{}/guilds/{}/", url_api, guild_id))
|
||||||
|
@ -181,7 +182,7 @@ impl Guild {
|
||||||
let response = match LimitedRequester::send_request(
|
let response = match LimitedRequester::send_request(
|
||||||
request,
|
request,
|
||||||
crate::api::limits::LimitType::Guild,
|
crate::api::limits::LimitType::Guild,
|
||||||
limits_instance,
|
instance,
|
||||||
limits_user,
|
limits_user,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
@ -221,7 +222,7 @@ impl Channel {
|
||||||
guild_id,
|
guild_id,
|
||||||
schema,
|
schema,
|
||||||
&mut user.limits,
|
&mut user.limits,
|
||||||
&mut belongs_to.limits,
|
&mut belongs_to,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -232,7 +233,7 @@ impl Channel {
|
||||||
guild_id: &str,
|
guild_id: &str,
|
||||||
schema: ChannelCreateSchema,
|
schema: ChannelCreateSchema,
|
||||||
limits_user: &mut Limits,
|
limits_user: &mut Limits,
|
||||||
limits_instance: &mut Limits,
|
instance: &mut Instance,
|
||||||
) -> Result<Channel, ChorusLibError> {
|
) -> Result<Channel, ChorusLibError> {
|
||||||
let request = Client::new()
|
let request = Client::new()
|
||||||
.post(format!("{}/guilds/{}/channels/", url_api, guild_id))
|
.post(format!("{}/guilds/{}/channels/", url_api, guild_id))
|
||||||
|
@ -241,7 +242,7 @@ impl Channel {
|
||||||
let result = match LimitedRequester::send_request(
|
let result = match LimitedRequester::send_request(
|
||||||
request,
|
request,
|
||||||
crate::api::limits::LimitType::Guild,
|
crate::api::limits::LimitType::Guild,
|
||||||
limits_instance,
|
instance,
|
||||||
limits_user,
|
limits_user,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -6,11 +6,9 @@ use crate::instance::Instance;
|
||||||
use crate::types::GeneralConfiguration;
|
use crate::types::GeneralConfiguration;
|
||||||
|
|
||||||
impl Instance {
|
impl Instance {
|
||||||
/**
|
/// Gets the instance policies schema.
|
||||||
Gets the instance policies schema.
|
/// # Errors
|
||||||
# Errors
|
/// [`ChorusLibError`] - If the request fails.
|
||||||
[`ChorusLibError`] - If the request fails.
|
|
||||||
*/
|
|
||||||
pub async fn general_configuration_schema(
|
pub async fn general_configuration_schema(
|
||||||
&self,
|
&self,
|
||||||
) -> Result<GeneralConfiguration, ChorusLibError> {
|
) -> Result<GeneralConfiguration, ChorusLibError> {
|
||||||
|
|
|
@ -10,16 +10,18 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
impl UserMeta {
|
impl UserMeta {
|
||||||
/**
|
/// Get a user object by id, or get the current user.
|
||||||
Get a user object by id, or get the current user.
|
///
|
||||||
# Arguments
|
/// # Arguments
|
||||||
* `token` - A valid access token for the API.
|
///
|
||||||
* `url_api` - The URL to the API.
|
/// * `token` - A valid access token for the API.
|
||||||
* `id` - The id of the user that will be retrieved. If this is None, the current user will be retrieved.
|
/// * `url_api` - The URL to the API.
|
||||||
* `instance_limits` - The [`Limits`] of the instance.
|
/// * `id` - The id of the user that will be retrieved. If this is None, the current user will be retrieved.
|
||||||
# Errors
|
/// * `instance_limits` - The [`Limits`] of the instance.
|
||||||
* [`ChorusLibError`] - If the request fails.
|
///
|
||||||
*/
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// * [`ChorusLibError`] - If the request fails.
|
||||||
pub async fn get(user: &mut UserMeta, id: Option<&String>) -> Result<User, ChorusLibError> {
|
pub async fn get(user: &mut UserMeta, id: Option<&String>) -> Result<User, ChorusLibError> {
|
||||||
User::get(user, id).await
|
User::get(user, id).await
|
||||||
}
|
}
|
||||||
|
@ -27,9 +29,9 @@ impl UserMeta {
|
||||||
pub async fn get_settings(
|
pub async fn get_settings(
|
||||||
token: &String,
|
token: &String,
|
||||||
url_api: &String,
|
url_api: &String,
|
||||||
instance_limits: &mut Limits,
|
instance: &mut Instance,
|
||||||
) -> Result<UserSettings, ChorusLibError> {
|
) -> Result<UserSettings, ChorusLibError> {
|
||||||
User::get_settings(token, url_api, instance_limits).await
|
User::get_settings(token, url_api, instance).await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Modify the current user's `UserObject`.
|
/// Modify the current user's `UserObject`.
|
||||||
|
@ -89,7 +91,7 @@ impl User {
|
||||||
User::_get(
|
User::_get(
|
||||||
&user.token(),
|
&user.token(),
|
||||||
&format!("{}", belongs_to.urls.api),
|
&format!("{}", belongs_to.urls.api),
|
||||||
&mut belongs_to.limits,
|
&mut belongs_to,
|
||||||
id,
|
id,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
@ -98,7 +100,7 @@ impl User {
|
||||||
async fn _get(
|
async fn _get(
|
||||||
token: &str,
|
token: &str,
|
||||||
url_api: &str,
|
url_api: &str,
|
||||||
limits_instance: &mut Limits,
|
instance: &mut Instance,
|
||||||
id: Option<&String>,
|
id: Option<&String>,
|
||||||
) -> Result<User, ChorusLibError> {
|
) -> Result<User, ChorusLibError> {
|
||||||
let url = if id.is_none() {
|
let url = if id.is_none() {
|
||||||
|
@ -107,11 +109,11 @@ impl User {
|
||||||
format!("{}/users/{}", url_api, id.unwrap())
|
format!("{}/users/{}", url_api, id.unwrap())
|
||||||
};
|
};
|
||||||
let request = reqwest::Client::new().get(url).bearer_auth(token);
|
let request = reqwest::Client::new().get(url).bearer_auth(token);
|
||||||
let mut cloned_limits = limits_instance.clone();
|
let mut cloned_limits = instance.limits.clone();
|
||||||
match LimitedRequester::send_request(
|
match LimitedRequester::send_request(
|
||||||
request,
|
request,
|
||||||
crate::api::limits::LimitType::Ip,
|
crate::api::limits::LimitType::Ip,
|
||||||
limits_instance,
|
instance,
|
||||||
&mut cloned_limits,
|
&mut cloned_limits,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
@ -127,16 +129,16 @@ impl User {
|
||||||
pub async fn get_settings(
|
pub async fn get_settings(
|
||||||
token: &String,
|
token: &String,
|
||||||
url_api: &String,
|
url_api: &String,
|
||||||
instance_limits: &mut Limits,
|
instance: &mut Instance,
|
||||||
) -> Result<UserSettings, ChorusLibError> {
|
) -> Result<UserSettings, ChorusLibError> {
|
||||||
let request: reqwest::RequestBuilder = Client::new()
|
let request: reqwest::RequestBuilder = Client::new()
|
||||||
.get(format!("{}/users/@me/settings/", url_api))
|
.get(format!("{}/users/@me/settings/", url_api))
|
||||||
.bearer_auth(token);
|
.bearer_auth(token);
|
||||||
let mut cloned_limits = instance_limits.clone();
|
let mut cloned_limits = instance.limits.clone();
|
||||||
match LimitedRequester::send_request(
|
match LimitedRequester::send_request(
|
||||||
request,
|
request,
|
||||||
crate::api::limits::LimitType::Ip,
|
crate::api::limits::LimitType::Ip,
|
||||||
instance_limits,
|
instance,
|
||||||
&mut cloned_limits,
|
&mut cloned_limits,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
@ -163,6 +165,6 @@ impl Instance {
|
||||||
token: String,
|
token: String,
|
||||||
id: Option<&String>,
|
id: Option<&String>,
|
||||||
) -> Result<User, ChorusLibError> {
|
) -> Result<User, ChorusLibError> {
|
||||||
User::_get(&token, &self.urls.api, &mut self.limits, id).await
|
User::_get(&token, &self.urls.api.clone(), self, id).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ use std::cell::RefCell;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use reqwest::Client;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::api::limits::Limits;
|
use crate::api::limits::Limits;
|
||||||
|
@ -17,6 +18,7 @@ pub struct Instance {
|
||||||
pub urls: UrlBundle,
|
pub urls: UrlBundle,
|
||||||
pub instance_info: GeneralConfiguration,
|
pub instance_info: GeneralConfiguration,
|
||||||
pub limits: Limits,
|
pub limits: Limits,
|
||||||
|
pub client: Client,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Instance {
|
impl Instance {
|
||||||
|
@ -32,6 +34,7 @@ impl Instance {
|
||||||
// Will be overwritten in the next step
|
// Will be overwritten in the next step
|
||||||
instance_info: GeneralConfiguration::default(),
|
instance_info: GeneralConfiguration::default(),
|
||||||
limits: Limits::check_limits(urls.api).await,
|
limits: Limits::check_limits(urls.api).await,
|
||||||
|
client: Client::new(),
|
||||||
};
|
};
|
||||||
instance.instance_info = match instance.general_configuration_schema().await {
|
instance.instance_info = match instance.general_configuration_schema().await {
|
||||||
Ok(schema) => schema,
|
Ok(schema) => schema,
|
||||||
|
|
51
src/limit.rs
51
src/limit.rs
|
@ -1,21 +1,50 @@
|
||||||
use reqwest::{Client, RequestBuilder, Response};
|
use reqwest::{RequestBuilder, Response};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::limits::{Limit, LimitType, Limits, LimitsMutRef},
|
api::limits::{Limit, LimitType, Limits, LimitsMutRef},
|
||||||
errors::ChorusLibError,
|
errors::ChorusLibError,
|
||||||
|
instance::Instance,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct LimitedRequester;
|
pub struct LimitedRequester;
|
||||||
|
|
||||||
impl LimitedRequester {
|
impl LimitedRequester {
|
||||||
|
/// Checks if a request can be sent without hitting API rate limits and sends it, if true.
|
||||||
|
/// Will automatically update the rate limits of the LimitedRequester the request has been
|
||||||
|
/// sent with.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `request`: A `RequestBuilder` that contains a request ready to be sent. Unfinished or
|
||||||
|
/// invalid requests will result in the method panicing.
|
||||||
|
/// * `limit_type`: Because this library does not yet implement a way to check for which rate
|
||||||
|
/// limit will be used when the request gets send, you will have to specify this manually using
|
||||||
|
/// a `LimitType` enum.
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
///
|
||||||
|
/// * `Response`: The `Response` gotten from sending the request to the server. This will be
|
||||||
|
/// returned if the Request was built and send successfully. Is wrapped in an `Option`.
|
||||||
|
/// * `None`: `None` will be returned if the rate limit has been hit, and the request could
|
||||||
|
/// therefore not have been sent.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// This method will error if:
|
||||||
|
///
|
||||||
|
/// * The request does not return a success status code (200-299)
|
||||||
|
/// * The supplied `RequestBuilder` contains invalid or incomplete information
|
||||||
|
/// * There has been an error with processing (unwrapping) the `Response`
|
||||||
|
/// * The call to `update_limits` yielded errors. Read the methods' Errors section for more
|
||||||
|
/// information.
|
||||||
pub async fn send_request(
|
pub async fn send_request(
|
||||||
request: RequestBuilder,
|
request: RequestBuilder,
|
||||||
limit_type: LimitType,
|
limit_type: LimitType,
|
||||||
instance_rate_limits: &mut Limits,
|
instance: &mut Instance,
|
||||||
user_rate_limits: &mut Limits,
|
user_rate_limits: &mut Limits,
|
||||||
) -> Result<Response, ChorusLibError> {
|
) -> Result<Response, ChorusLibError> {
|
||||||
if LimitedRequester::can_send_request(limit_type, instance_rate_limits, user_rate_limits) {
|
if LimitedRequester::can_send_request(limit_type, &instance.limits, user_rate_limits) {
|
||||||
let built_request = match request.build() {
|
let built_request = match request.build() {
|
||||||
Ok(request) => request,
|
Ok(request) => request,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -25,7 +54,7 @@ impl LimitedRequester {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let result = Client::new().execute(built_request).await;
|
let result = instance.client.execute(built_request).await;
|
||||||
let response = match result {
|
let response = match result {
|
||||||
Ok(is_response) => is_response,
|
Ok(is_response) => is_response,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -37,7 +66,7 @@ impl LimitedRequester {
|
||||||
LimitedRequester::update_limits(
|
LimitedRequester::update_limits(
|
||||||
&response,
|
&response,
|
||||||
limit_type,
|
limit_type,
|
||||||
instance_rate_limits,
|
&mut instance.limits,
|
||||||
user_rate_limits,
|
user_rate_limits,
|
||||||
);
|
);
|
||||||
if !response.status().is_success() {
|
if !response.status().is_success() {
|
||||||
|
@ -228,17 +257,17 @@ mod rate_limit {
|
||||||
String::from("http://localhost:3001/cdn"),
|
String::from("http://localhost:3001/cdn"),
|
||||||
);
|
);
|
||||||
let mut request: Option<Result<Response, ChorusLibError>> = None;
|
let mut request: Option<Result<Response, ChorusLibError>> = None;
|
||||||
let mut instance_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
let mut instance = Instance::new(urls.clone()).await.unwrap();
|
||||||
let mut user_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
let mut user_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
||||||
|
|
||||||
for _ in 0..=50 {
|
for _ in 0..=50 {
|
||||||
let request_path = urls.api.clone() + "/some/random/nonexisting/path";
|
let request_path = urls.api.clone() + "/some/random/nonexisting/path";
|
||||||
let request_builder = Client::new().get(request_path);
|
let request_builder = instance.client.get(request_path);
|
||||||
request = Some(
|
request = Some(
|
||||||
LimitedRequester::send_request(
|
LimitedRequester::send_request(
|
||||||
request_builder,
|
request_builder,
|
||||||
LimitType::Channel,
|
LimitType::Channel,
|
||||||
&mut instance_rate_limits,
|
&mut instance,
|
||||||
&mut user_rate_limits,
|
&mut user_rate_limits,
|
||||||
)
|
)
|
||||||
.await,
|
.await,
|
||||||
|
@ -254,15 +283,15 @@ mod rate_limit {
|
||||||
String::from("wss://localhost:3001/"),
|
String::from("wss://localhost:3001/"),
|
||||||
String::from("http://localhost:3001/cdn"),
|
String::from("http://localhost:3001/cdn"),
|
||||||
);
|
);
|
||||||
let mut instance_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
let mut instance = Instance::new(urls.clone()).await.unwrap();
|
||||||
let mut user_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
let mut user_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
||||||
let _requester = LimitedRequester;
|
let _requester = LimitedRequester;
|
||||||
let request_path = urls.api.clone() + "/policies/instance/limits";
|
let request_path = urls.api.clone() + "/policies/instance/limits";
|
||||||
let request_builder = Client::new().get(request_path);
|
let request_builder = instance.client.get(request_path);
|
||||||
let request = LimitedRequester::send_request(
|
let request = LimitedRequester::send_request(
|
||||||
request_builder,
|
request_builder,
|
||||||
LimitType::Channel,
|
LimitType::Channel,
|
||||||
&mut instance_rate_limits,
|
&mut instance,
|
||||||
&mut user_rate_limits,
|
&mut user_rate_limits,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
Loading…
Reference in New Issue