Merge pull request #15 from polyphony-chat/improvement/update-rate-limiter-implementation
Improvement/update rate limiter implementation
This commit is contained in:
commit
ee0d9f2b67
|
@ -17,8 +17,17 @@ pub mod login {
|
||||||
let client = Client::new();
|
let client = Client::new();
|
||||||
let endpoint_url = self.urls.get_api().to_string() + "/auth/login";
|
let endpoint_url = self.urls.get_api().to_string() + "/auth/login";
|
||||||
let request_builder = client.post(endpoint_url).body(json_schema.to_string());
|
let request_builder = client.post(endpoint_url).body(json_schema.to_string());
|
||||||
|
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
||||||
|
// request (since login is an instance wide limit), which is why we are just cloning the
|
||||||
|
// instances' limits to pass them on as user_rate_limits later.
|
||||||
|
let mut cloned_limits = self.limits.clone();
|
||||||
let response = requester
|
let response = requester
|
||||||
.send_request(request_builder, LimitType::AuthRegister)
|
.send_request(
|
||||||
|
request_builder,
|
||||||
|
LimitType::AuthRegister,
|
||||||
|
&mut self.limits,
|
||||||
|
&mut cloned_limits,
|
||||||
|
)
|
||||||
.await;
|
.await;
|
||||||
if !response.is_ok() {
|
if !response.is_ok() {
|
||||||
return Err(InstanceServerError::NoResponse);
|
return Err(InstanceServerError::NoResponse);
|
||||||
|
|
|
@ -28,8 +28,17 @@ pub mod register {
|
||||||
let client = Client::new();
|
let client = Client::new();
|
||||||
let endpoint_url = self.urls.get_api().to_string() + "/auth/register";
|
let endpoint_url = self.urls.get_api().to_string() + "/auth/register";
|
||||||
let request_builder = client.post(endpoint_url).body(json_schema.to_string());
|
let request_builder = client.post(endpoint_url).body(json_schema.to_string());
|
||||||
|
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
||||||
|
// request (since register is an instance wide limit), which is why we are just cloning
|
||||||
|
// the instances' limits to pass them on as user_rate_limits later.
|
||||||
|
let mut cloned_limits = self.limits.clone();
|
||||||
let response = limited_requester
|
let response = limited_requester
|
||||||
.send_request(request_builder, LimitType::AuthRegister)
|
.send_request(
|
||||||
|
request_builder,
|
||||||
|
LimitType::AuthRegister,
|
||||||
|
&mut self.limits,
|
||||||
|
&mut cloned_limits,
|
||||||
|
)
|
||||||
.await;
|
.await;
|
||||||
if !response.is_ok() {
|
if !response.is_ok() {
|
||||||
return Err(InstanceServerError::NoResponse);
|
return Err(InstanceServerError::NoResponse);
|
||||||
|
@ -111,7 +120,7 @@ mod test {
|
||||||
AuthUsername::new("Hiiii".to_string()).unwrap(),
|
AuthUsername::new("Hiiii".to_string()).unwrap(),
|
||||||
Some(AuthPassword::new("mysupersecurepass123!".to_string()).unwrap()),
|
Some(AuthPassword::new("mysupersecurepass123!".to_string()).unwrap()),
|
||||||
true,
|
true,
|
||||||
Some(AuthEmail::new("flori@aaaa.xyz".to_string()).unwrap()),
|
Some(AuthEmail::new("random978234@aaaa.xyz".to_string()).unwrap()),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
Some("2000-01-01".to_string()),
|
Some("2000-01-01".to_string()),
|
||||||
|
|
|
@ -166,6 +166,70 @@ pub mod limits {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct LimitsMutRef<'a> {
|
||||||
|
pub limit_absolute_messages: &'a mut Limit,
|
||||||
|
pub limit_absolute_register: &'a mut Limit,
|
||||||
|
pub limit_auth_login: &'a mut Limit,
|
||||||
|
pub limit_auth_register: &'a mut Limit,
|
||||||
|
pub limit_ip: &'a mut Limit,
|
||||||
|
pub limit_global: &'a mut Limit,
|
||||||
|
pub limit_error: &'a mut Limit,
|
||||||
|
pub limit_guild: &'a mut Limit,
|
||||||
|
pub limit_webhook: &'a mut Limit,
|
||||||
|
pub limit_channel: &'a mut Limit,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LimitsMutRef<'_> {
|
||||||
|
pub fn combine_mut_ref<'a>(
|
||||||
|
instance_rate_limits: &'a mut Limits,
|
||||||
|
user_rate_limits: &'a mut Limits,
|
||||||
|
) -> LimitsMutRef<'a> {
|
||||||
|
return LimitsMutRef {
|
||||||
|
limit_absolute_messages: &mut instance_rate_limits.limit_absolute_messages,
|
||||||
|
limit_absolute_register: &mut instance_rate_limits.limit_absolute_register,
|
||||||
|
limit_auth_login: &mut instance_rate_limits.limit_auth_login,
|
||||||
|
limit_auth_register: &mut instance_rate_limits.limit_auth_register,
|
||||||
|
limit_channel: &mut user_rate_limits.limit_channel,
|
||||||
|
limit_error: &mut user_rate_limits.limit_error,
|
||||||
|
limit_global: &mut instance_rate_limits.limit_global,
|
||||||
|
limit_guild: &mut user_rate_limits.limit_guild,
|
||||||
|
limit_ip: &mut instance_rate_limits.limit_ip,
|
||||||
|
limit_webhook: &mut user_rate_limits.limit_webhook,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_limit_ref(&self, limit_type: &LimitType) -> &Limit {
|
||||||
|
match limit_type {
|
||||||
|
&LimitType::AbsoluteMessage => &self.limit_absolute_messages,
|
||||||
|
&LimitType::AbsoluteRegister => &self.limit_absolute_register,
|
||||||
|
&LimitType::AuthLogin => &self.limit_auth_login,
|
||||||
|
&LimitType::AuthRegister => &self.limit_auth_register,
|
||||||
|
&LimitType::Channel => &self.limit_channel,
|
||||||
|
&LimitType::Error => &self.limit_error,
|
||||||
|
&LimitType::Global => &self.limit_global,
|
||||||
|
&LimitType::Guild => &self.limit_guild,
|
||||||
|
&LimitType::Ip => &self.limit_ip,
|
||||||
|
&LimitType::Webhook => &self.limit_webhook,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_limit_mut_ref(&mut self, limit_type: &LimitType) -> &mut Limit {
|
||||||
|
match limit_type {
|
||||||
|
&LimitType::AbsoluteMessage => &mut self.limit_absolute_messages,
|
||||||
|
&LimitType::AbsoluteRegister => &mut self.limit_absolute_register,
|
||||||
|
&LimitType::AuthLogin => &mut self.limit_auth_login,
|
||||||
|
&LimitType::AuthRegister => &mut self.limit_auth_register,
|
||||||
|
&LimitType::Channel => &mut self.limit_channel,
|
||||||
|
&LimitType::Error => &mut self.limit_error,
|
||||||
|
&LimitType::Global => &mut self.limit_global,
|
||||||
|
&LimitType::Guild => &mut self.limit_guild,
|
||||||
|
&LimitType::Ip => &mut self.limit_ip,
|
||||||
|
&LimitType::Webhook => &mut self.limit_webhook,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct Limits {
|
pub struct Limits {
|
||||||
pub limit_absolute_messages: Limit,
|
pub limit_absolute_messages: Limit,
|
||||||
pub limit_absolute_register: Limit,
|
pub limit_absolute_register: Limit,
|
||||||
|
@ -180,19 +244,64 @@ pub mod limits {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Limits {
|
impl Limits {
|
||||||
pub fn iter(&self) -> std::vec::IntoIter<Limit> {
|
pub fn combine(instance_rate_limits: &Limits, user_rate_limits: &Limits) -> Limits {
|
||||||
let mut limits: Vec<Limit> = Vec::new();
|
return Limits {
|
||||||
limits.push(self.limit_absolute_messages.clone());
|
limit_absolute_messages: instance_rate_limits.limit_absolute_messages,
|
||||||
limits.push(self.limit_absolute_register.clone());
|
limit_absolute_register: instance_rate_limits.limit_absolute_register,
|
||||||
limits.push(self.limit_auth_login.clone());
|
limit_auth_login: instance_rate_limits.limit_auth_login,
|
||||||
limits.push(self.limit_auth_register.clone());
|
limit_auth_register: instance_rate_limits.limit_auth_register,
|
||||||
limits.push(self.limit_ip.clone());
|
limit_channel: user_rate_limits.limit_channel,
|
||||||
limits.push(self.limit_global.clone());
|
limit_error: user_rate_limits.limit_error,
|
||||||
limits.push(self.limit_error.clone());
|
limit_global: instance_rate_limits.limit_global,
|
||||||
limits.push(self.limit_guild.clone());
|
limit_guild: user_rate_limits.limit_guild,
|
||||||
limits.push(self.limit_webhook.clone());
|
limit_ip: instance_rate_limits.limit_ip,
|
||||||
limits.push(self.limit_channel.clone());
|
limit_webhook: user_rate_limits.limit_webhook,
|
||||||
limits.into_iter()
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_limit_ref(&self, limit_type: &LimitType) -> &Limit {
|
||||||
|
match limit_type {
|
||||||
|
&LimitType::AbsoluteMessage => &self.limit_absolute_messages,
|
||||||
|
&LimitType::AbsoluteRegister => &self.limit_absolute_register,
|
||||||
|
&LimitType::AuthLogin => &self.limit_auth_login,
|
||||||
|
&LimitType::AuthRegister => &self.limit_auth_register,
|
||||||
|
&LimitType::Channel => &self.limit_channel,
|
||||||
|
&LimitType::Error => &self.limit_error,
|
||||||
|
&LimitType::Global => &self.limit_global,
|
||||||
|
&LimitType::Guild => &self.limit_guild,
|
||||||
|
&LimitType::Ip => &self.limit_ip,
|
||||||
|
&LimitType::Webhook => &self.limit_webhook,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_limit_mut_ref(&mut self, limit_type: &LimitType) -> &mut Limit {
|
||||||
|
match limit_type {
|
||||||
|
&LimitType::AbsoluteMessage => &mut self.limit_absolute_messages,
|
||||||
|
&LimitType::AbsoluteRegister => &mut self.limit_absolute_register,
|
||||||
|
&LimitType::AuthLogin => &mut self.limit_auth_login,
|
||||||
|
&LimitType::AuthRegister => &mut self.limit_auth_register,
|
||||||
|
&LimitType::Channel => &mut self.limit_channel,
|
||||||
|
&LimitType::Error => &mut self.limit_error,
|
||||||
|
&LimitType::Global => &mut self.limit_global,
|
||||||
|
&LimitType::Guild => &mut self.limit_guild,
|
||||||
|
&LimitType::Ip => &mut self.limit_ip,
|
||||||
|
&LimitType::Webhook => &mut self.limit_webhook,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_hash_map(&self) -> HashMap<LimitType, Limit> {
|
||||||
|
let mut map: HashMap<LimitType, Limit> = HashMap::new();
|
||||||
|
map.insert(LimitType::AbsoluteMessage, self.limit_absolute_messages);
|
||||||
|
map.insert(LimitType::AbsoluteRegister, self.limit_absolute_register);
|
||||||
|
map.insert(LimitType::AuthLogin, self.limit_auth_login);
|
||||||
|
map.insert(LimitType::AuthRegister, self.limit_auth_register);
|
||||||
|
map.insert(LimitType::Ip, self.limit_ip);
|
||||||
|
map.insert(LimitType::Global, self.limit_global);
|
||||||
|
map.insert(LimitType::Error, self.limit_error);
|
||||||
|
map.insert(LimitType::Guild, self.limit_guild);
|
||||||
|
map.insert(LimitType::Webhook, self.limit_webhook);
|
||||||
|
map.insert(LimitType::Channel, self.limit_channel);
|
||||||
|
map
|
||||||
}
|
}
|
||||||
|
|
||||||
/// check_limits uses the API to get the current request limits of the instance.
|
/// check_limits uses the API to get the current request limits of the instance.
|
||||||
|
@ -201,7 +310,7 @@ pub mod limits {
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// This function will panic if the request fails or if the response body cannot be parsed.
|
/// This function will panic if the request fails or if the response body cannot be parsed.
|
||||||
/// TODO: Change this to return a Result and handle the errors properly.
|
/// TODO: Change this to return a Result and handle the errors properly.
|
||||||
pub async fn check_limits(api_url: String) -> HashMap<LimitType, Limit> {
|
pub async fn check_limits(api_url: String) -> Limits {
|
||||||
let client = Client::new();
|
let client = Client::new();
|
||||||
let url_parsed = crate::URLBundle::parse_url(api_url) + "/policies/instance/limits";
|
let url_parsed = crate::URLBundle::parse_url(api_url) + "/policies/instance/limits";
|
||||||
let result = client
|
let result = client
|
||||||
|
@ -219,213 +328,151 @@ pub mod limits {
|
||||||
});
|
});
|
||||||
let config: Config = from_str(&result).unwrap();
|
let config: Config = from_str(&result).unwrap();
|
||||||
// If config.rate.enabled is false, then add return a Limits struct with all limits set to u64::MAX
|
// If config.rate.enabled is false, then add return a Limits struct with all limits set to u64::MAX
|
||||||
let mut limits: HashMap<LimitType, Limit> = HashMap::new();
|
let mut limits: Limits;
|
||||||
if config.rate.enabled == false {
|
if config.rate.enabled == false {
|
||||||
limits.insert(
|
limits = Limits {
|
||||||
LimitType::AbsoluteMessage,
|
limit_absolute_messages: Limit {
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AbsoluteMessage,
|
bucket: LimitType::AbsoluteMessage,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_absolute_register: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AbsoluteRegister,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AbsoluteRegister,
|
bucket: LimitType::AbsoluteRegister,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_auth_login: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AuthLogin,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AuthLogin,
|
bucket: LimitType::AuthLogin,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_auth_register: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AuthRegister,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AuthRegister,
|
bucket: LimitType::AuthRegister,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_ip: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Ip,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Ip,
|
bucket: LimitType::Ip,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_global: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Global,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Global,
|
bucket: LimitType::Global,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_error: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Error,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Error,
|
bucket: LimitType::Error,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_guild: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Guild,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Guild,
|
bucket: LimitType::Guild,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_webhook: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Webhook,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Webhook,
|
bucket: LimitType::Webhook,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
limit_channel: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Channel,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Channel,
|
bucket: LimitType::Channel,
|
||||||
limit: u64::MAX,
|
limit: u64::MAX,
|
||||||
remaining: u64::MAX,
|
remaining: u64::MAX,
|
||||||
reset: u64::MAX,
|
reset: u64::MAX,
|
||||||
},
|
},
|
||||||
);
|
};
|
||||||
} else {
|
} else {
|
||||||
limits.insert(
|
limits = Limits {
|
||||||
LimitType::AbsoluteMessage,
|
limit_absolute_messages: Limit {
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AbsoluteMessage,
|
bucket: LimitType::AbsoluteMessage,
|
||||||
limit: config.absoluteRate.sendMessage.limit,
|
limit: config.absoluteRate.sendMessage.limit,
|
||||||
remaining: config.absoluteRate.sendMessage.limit,
|
remaining: config.absoluteRate.sendMessage.limit,
|
||||||
reset: config.absoluteRate.sendMessage.window,
|
reset: config.absoluteRate.sendMessage.window,
|
||||||
},
|
},
|
||||||
);
|
limit_absolute_register: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AbsoluteRegister,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AbsoluteRegister,
|
bucket: LimitType::AbsoluteRegister,
|
||||||
limit: config.absoluteRate.register.limit,
|
limit: config.absoluteRate.register.limit,
|
||||||
remaining: config.absoluteRate.register.limit,
|
remaining: config.absoluteRate.register.limit,
|
||||||
reset: config.absoluteRate.register.window,
|
reset: config.absoluteRate.register.window,
|
||||||
},
|
},
|
||||||
);
|
limit_auth_login: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AuthLogin,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AuthLogin,
|
bucket: LimitType::AuthLogin,
|
||||||
limit: config.rate.routes.auth.login.count,
|
limit: config.rate.routes.auth.login.count,
|
||||||
remaining: config.rate.routes.auth.login.count,
|
remaining: config.rate.routes.auth.login.count,
|
||||||
reset: config.rate.routes.auth.login.window,
|
reset: config.rate.routes.auth.login.window,
|
||||||
},
|
},
|
||||||
);
|
limit_auth_register: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::AuthRegister,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::AuthRegister,
|
bucket: LimitType::AuthRegister,
|
||||||
limit: config.rate.routes.auth.register.count,
|
limit: config.rate.routes.auth.register.count,
|
||||||
remaining: config.rate.routes.auth.register.count,
|
remaining: config.rate.routes.auth.register.count,
|
||||||
reset: config.rate.routes.auth.register.window,
|
reset: config.rate.routes.auth.register.window,
|
||||||
},
|
},
|
||||||
);
|
limit_ip: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Guild,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Guild,
|
|
||||||
limit: config.rate.routes.guild.count,
|
|
||||||
remaining: config.rate.routes.guild.count,
|
|
||||||
reset: config.rate.routes.guild.window,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
limits.insert(
|
|
||||||
LimitType::Webhook,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Webhook,
|
|
||||||
limit: config.rate.routes.webhook.count,
|
|
||||||
remaining: config.rate.routes.webhook.count,
|
|
||||||
reset: config.rate.routes.webhook.window,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
limits.insert(
|
|
||||||
LimitType::Channel,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Channel,
|
|
||||||
limit: config.rate.routes.channel.count,
|
|
||||||
remaining: config.rate.routes.channel.count,
|
|
||||||
reset: config.rate.routes.channel.window,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
limits.insert(
|
|
||||||
LimitType::Ip,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Ip,
|
bucket: LimitType::Ip,
|
||||||
limit: config.rate.ip.count,
|
limit: config.rate.ip.count,
|
||||||
remaining: config.rate.ip.count,
|
remaining: config.rate.ip.count,
|
||||||
reset: config.rate.ip.window,
|
reset: config.rate.ip.window,
|
||||||
},
|
},
|
||||||
);
|
limit_global: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Global,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Global,
|
bucket: LimitType::Global,
|
||||||
limit: config.rate.global.count,
|
limit: config.rate.global.count,
|
||||||
remaining: config.rate.global.count,
|
remaining: config.rate.global.count,
|
||||||
reset: config.rate.global.window,
|
reset: config.rate.global.window,
|
||||||
},
|
},
|
||||||
);
|
limit_error: Limit {
|
||||||
limits.insert(
|
|
||||||
LimitType::Error,
|
|
||||||
Limit {
|
|
||||||
bucket: LimitType::Error,
|
bucket: LimitType::Error,
|
||||||
limit: config.rate.error.count,
|
limit: config.rate.error.count,
|
||||||
remaining: config.rate.error.count,
|
remaining: config.rate.error.count,
|
||||||
reset: config.rate.error.window,
|
reset: config.rate.error.window,
|
||||||
},
|
},
|
||||||
);
|
limit_guild: Limit {
|
||||||
|
bucket: LimitType::Guild,
|
||||||
|
limit: config.rate.routes.guild.count,
|
||||||
|
remaining: config.rate.routes.guild.count,
|
||||||
|
reset: config.rate.routes.guild.window,
|
||||||
|
},
|
||||||
|
limit_webhook: Limit {
|
||||||
|
bucket: LimitType::Webhook,
|
||||||
|
limit: config.rate.routes.webhook.count,
|
||||||
|
remaining: config.rate.routes.webhook.count,
|
||||||
|
reset: config.rate.routes.webhook.window,
|
||||||
|
},
|
||||||
|
limit_channel: Limit {
|
||||||
|
bucket: LimitType::Channel,
|
||||||
|
limit: config.rate.routes.channel.count,
|
||||||
|
remaining: config.rate.routes.channel.count,
|
||||||
|
reset: config.rate.routes.channel.window,
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.absoluteRate.register.enabled {
|
if !config.absoluteRate.register.enabled {
|
||||||
limits.insert(
|
limits.limit_absolute_register = Limit {
|
||||||
LimitType::AbsoluteRegister,
|
bucket: LimitType::AbsoluteRegister,
|
||||||
Limit {
|
limit: u64::MAX,
|
||||||
bucket: LimitType::AbsoluteRegister,
|
remaining: u64::MAX,
|
||||||
limit: u64::MAX,
|
reset: u64::MAX,
|
||||||
remaining: u64::MAX,
|
};
|
||||||
reset: u64::MAX,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.absoluteRate.sendMessage.enabled {
|
if !config.absoluteRate.sendMessage.enabled {
|
||||||
limits.insert(
|
limits.limit_absolute_messages = Limit {
|
||||||
LimitType::AbsoluteMessage,
|
bucket: LimitType::AbsoluteMessage,
|
||||||
Limit {
|
limit: u64::MAX,
|
||||||
bucket: LimitType::AbsoluteMessage,
|
remaining: u64::MAX,
|
||||||
limit: u64::MAX,
|
reset: u64::MAX,
|
||||||
remaining: u64::MAX,
|
};
|
||||||
reset: u64::MAX,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return limits;
|
return limits;
|
||||||
|
|
|
@ -3,7 +3,7 @@ pub mod schemas {
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{collections::HashMap, fmt};
|
use std::{collections::HashMap, fmt};
|
||||||
|
|
||||||
use crate::{errors::FieldFormatError, URLBundle};
|
use crate::{api::limits::Limits, errors::FieldFormatError, URLBundle};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A struct that represents a well-formed email address.
|
A struct that represents a well-formed email address.
|
||||||
|
@ -405,6 +405,7 @@ pub mod schemas {
|
||||||
logged_in: bool,
|
logged_in: bool,
|
||||||
belongs_to: URLBundle,
|
belongs_to: URLBundle,
|
||||||
token: String,
|
token: String,
|
||||||
|
rate_limits: Limits,
|
||||||
pub settings: UserSettings,
|
pub settings: UserSettings,
|
||||||
pub object: UserObject,
|
pub object: UserObject,
|
||||||
}
|
}
|
||||||
|
@ -438,6 +439,7 @@ pub mod schemas {
|
||||||
logged_in: bool,
|
logged_in: bool,
|
||||||
belongs_to: URLBundle,
|
belongs_to: URLBundle,
|
||||||
token: String,
|
token: String,
|
||||||
|
rate_limits: Limits,
|
||||||
settings: UserSettings,
|
settings: UserSettings,
|
||||||
object: UserObject,
|
object: UserObject,
|
||||||
) -> User {
|
) -> User {
|
||||||
|
@ -445,6 +447,7 @@ pub mod schemas {
|
||||||
logged_in,
|
logged_in,
|
||||||
belongs_to,
|
belongs_to,
|
||||||
token,
|
token,
|
||||||
|
rate_limits,
|
||||||
settings,
|
settings,
|
||||||
object,
|
object,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::api::limits::{Limit, LimitType, Limits};
|
||||||
use crate::api::schemas::schemas::{InstancePoliciesSchema, User};
|
use crate::api::schemas::schemas::{InstancePoliciesSchema, User};
|
||||||
use crate::errors::{FieldFormatError, InstanceServerError};
|
use crate::errors::{FieldFormatError, InstanceServerError};
|
||||||
use crate::limit::LimitedRequester;
|
use crate::limit::LimitedRequester;
|
||||||
|
@ -14,6 +15,7 @@ pub struct Instance {
|
||||||
pub urls: URLBundle,
|
pub urls: URLBundle,
|
||||||
pub instance_info: InstancePoliciesSchema,
|
pub instance_info: InstancePoliciesSchema,
|
||||||
pub requester: LimitedRequester,
|
pub requester: LimitedRequester,
|
||||||
|
pub limits: Limits,
|
||||||
//pub gateway: Gateway,
|
//pub gateway: Gateway,
|
||||||
pub users: HashMap<Token, User>,
|
pub users: HashMap<Token, User>,
|
||||||
}
|
}
|
||||||
|
@ -31,7 +33,7 @@ impl Instance {
|
||||||
) -> Result<Instance, InstanceServerError> {
|
) -> Result<Instance, InstanceServerError> {
|
||||||
let users: HashMap<Token, User> = HashMap::new();
|
let users: HashMap<Token, User> = HashMap::new();
|
||||||
let mut instance = Instance {
|
let mut instance = Instance {
|
||||||
urls,
|
urls: urls.clone(),
|
||||||
instance_info: InstancePoliciesSchema::new(
|
instance_info: InstancePoliciesSchema::new(
|
||||||
// This is okay, because the instance_info will be overwritten by the instance_policies_schema() function.
|
// This is okay, because the instance_info will be overwritten by the instance_policies_schema() function.
|
||||||
"".to_string(),
|
"".to_string(),
|
||||||
|
@ -43,6 +45,7 @@ impl Instance {
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
),
|
),
|
||||||
|
limits: Limits::check_limits(urls.api).await,
|
||||||
requester,
|
requester,
|
||||||
users,
|
users,
|
||||||
};
|
};
|
||||||
|
|
139
src/limit.rs
139
src/limit.rs
|
@ -1,10 +1,10 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
api::limits::{Limit, LimitType, Limits},
|
api::limits::{Limit, LimitType, Limits, LimitsMutRef},
|
||||||
errors::InstanceServerError,
|
errors::InstanceServerError,
|
||||||
};
|
};
|
||||||
|
|
||||||
use reqwest::{Client, RequestBuilder, Response};
|
use reqwest::{Client, RequestBuilder, Response};
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
// Note: There seem to be some overlapping request limiters. We need to make sure that sending a
|
// Note: There seem to be some overlapping request limiters. We need to make sure that sending a
|
||||||
// request checks for all the request limiters that apply, and blocks if any of the limiters are 0
|
// request checks for all the request limiters that apply, and blocks if any of the limiters are 0
|
||||||
|
@ -20,7 +20,6 @@ pub struct TypedRequest {
|
||||||
pub struct LimitedRequester {
|
pub struct LimitedRequester {
|
||||||
http: Client,
|
http: Client,
|
||||||
requests: VecDeque<TypedRequest>,
|
requests: VecDeque<TypedRequest>,
|
||||||
limits_rate: HashMap<LimitType, Limit>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LimitedRequester {
|
impl LimitedRequester {
|
||||||
|
@ -33,7 +32,6 @@ impl LimitedRequester {
|
||||||
LimitedRequester {
|
LimitedRequester {
|
||||||
http: Client::new(),
|
http: Client::new(),
|
||||||
requests: VecDeque::new(),
|
requests: VecDeque::new(),
|
||||||
limits_rate: Limits::check_limits(api_url).await,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,8 +68,10 @@ impl LimitedRequester {
|
||||||
&mut self,
|
&mut self,
|
||||||
request: RequestBuilder,
|
request: RequestBuilder,
|
||||||
limit_type: LimitType,
|
limit_type: LimitType,
|
||||||
|
instance_rate_limits: &mut Limits,
|
||||||
|
user_rate_limits: &mut Limits,
|
||||||
) -> Result<Response, InstanceServerError> {
|
) -> Result<Response, InstanceServerError> {
|
||||||
if self.can_send_request(limit_type) {
|
if self.can_send_request(limit_type, instance_rate_limits, user_rate_limits) {
|
||||||
let built_request = request
|
let built_request = request
|
||||||
.build()
|
.build()
|
||||||
.unwrap_or_else(|e| panic!("Error while building the Request for sending: {}", e));
|
.unwrap_or_else(|e| panic!("Error while building the Request for sending: {}", e));
|
||||||
|
@ -80,7 +80,12 @@ impl LimitedRequester {
|
||||||
Ok(is_response) => is_response,
|
Ok(is_response) => is_response,
|
||||||
Err(e) => panic!("An error occured while processing the response: {}", e),
|
Err(e) => panic!("An error occured while processing the response: {}", e),
|
||||||
};
|
};
|
||||||
self.update_limits(&response, limit_type);
|
self.update_limits(
|
||||||
|
&response,
|
||||||
|
limit_type,
|
||||||
|
instance_rate_limits,
|
||||||
|
user_rate_limits,
|
||||||
|
);
|
||||||
return Ok(response);
|
return Ok(response);
|
||||||
} else {
|
} else {
|
||||||
self.requests.push_back(TypedRequest {
|
self.requests.push_back(TypedRequest {
|
||||||
|
@ -102,9 +107,16 @@ impl LimitedRequester {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn can_send_request(&mut self, limit_type: LimitType) -> bool {
|
fn can_send_request(
|
||||||
let limits = &self.limits_rate.clone();
|
&mut self,
|
||||||
|
limit_type: LimitType,
|
||||||
|
instance_rate_limits: &Limits,
|
||||||
|
user_rate_limits: &Limits,
|
||||||
|
) -> bool {
|
||||||
// Check if all of the limits in this vec have at least one remaining request
|
// Check if all of the limits in this vec have at least one remaining request
|
||||||
|
|
||||||
|
let rate_limits = Limits::combine(instance_rate_limits, user_rate_limits);
|
||||||
|
|
||||||
let constant_limits: Vec<&LimitType> = [
|
let constant_limits: Vec<&LimitType> = [
|
||||||
&LimitType::Error,
|
&LimitType::Error,
|
||||||
&LimitType::Global,
|
&LimitType::Global,
|
||||||
|
@ -113,19 +125,29 @@ impl LimitedRequester {
|
||||||
]
|
]
|
||||||
.to_vec();
|
.to_vec();
|
||||||
for limit in constant_limits.iter() {
|
for limit in constant_limits.iter() {
|
||||||
match limits.get(&limit) {
|
match rate_limits.to_hash_map().get(&limit) {
|
||||||
Some(limit) => {
|
Some(limit) => {
|
||||||
if limit.remaining == 0 {
|
if limit.remaining == 0 {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// AbsoluteRegister and AuthRegister can cancel each other out.
|
// AbsoluteRegister and AuthRegister can cancel each other out.
|
||||||
if limit.bucket == LimitType::AbsoluteRegister
|
if limit.bucket == LimitType::AbsoluteRegister
|
||||||
&& limits.get(&LimitType::AuthRegister).unwrap().remaining == 0
|
&& rate_limits
|
||||||
|
.to_hash_map()
|
||||||
|
.get(&LimitType::AuthRegister)
|
||||||
|
.unwrap()
|
||||||
|
.remaining
|
||||||
|
== 0
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if limit.bucket == LimitType::AuthRegister
|
if limit.bucket == LimitType::AuthRegister
|
||||||
&& limits.get(&LimitType::AbsoluteRegister).unwrap().remaining == 0
|
&& rate_limits
|
||||||
|
.to_hash_map()
|
||||||
|
.get(&LimitType::AbsoluteRegister)
|
||||||
|
.unwrap()
|
||||||
|
.remaining
|
||||||
|
== 0
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -136,97 +158,94 @@ impl LimitedRequester {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_limits(&mut self, response: &Response, limit_type: LimitType) {
|
fn update_limits(
|
||||||
|
&mut self,
|
||||||
|
response: &Response,
|
||||||
|
limit_type: LimitType,
|
||||||
|
instance_rate_limits: &mut Limits,
|
||||||
|
user_rate_limits: &mut Limits,
|
||||||
|
) {
|
||||||
|
let mut rate_limits = LimitsMutRef::combine_mut_ref(instance_rate_limits, user_rate_limits);
|
||||||
|
|
||||||
let remaining = match response.headers().get("X-RateLimit-Remaining") {
|
let remaining = match response.headers().get("X-RateLimit-Remaining") {
|
||||||
Some(remaining) => remaining.to_str().unwrap().parse::<u64>().unwrap(),
|
Some(remaining) => remaining.to_str().unwrap().parse::<u64>().unwrap(),
|
||||||
None => self.limits_rate.get(&limit_type).unwrap().remaining - 1,
|
None => rate_limits.get_limit_mut_ref(&limit_type).remaining - 1,
|
||||||
};
|
};
|
||||||
let limit = match response.headers().get("X-RateLimit-Limit") {
|
let limit = match response.headers().get("X-RateLimit-Limit") {
|
||||||
Some(limit) => limit.to_str().unwrap().parse::<u64>().unwrap(),
|
Some(limit) => limit.to_str().unwrap().parse::<u64>().unwrap(),
|
||||||
None => self.limits_rate.get(&limit_type).unwrap().limit,
|
None => rate_limits.get_limit_mut_ref(&limit_type).limit,
|
||||||
};
|
};
|
||||||
let reset = match response.headers().get("X-RateLimit-Reset") {
|
let reset = match response.headers().get("X-RateLimit-Reset") {
|
||||||
Some(reset) => reset.to_str().unwrap().parse::<u64>().unwrap(),
|
Some(reset) => reset.to_str().unwrap().parse::<u64>().unwrap(),
|
||||||
None => self.limits_rate.get(&limit_type).unwrap().reset,
|
None => rate_limits.get_limit_mut_ref(&limit_type).reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
let status = response.status();
|
let status = response.status();
|
||||||
let status_str = status.as_str();
|
let status_str = status.as_str();
|
||||||
|
|
||||||
if status_str.chars().next().unwrap() == '4' {
|
if status_str.chars().next().unwrap() == '4' {
|
||||||
self.limits_rate
|
rate_limits
|
||||||
.get_mut(&LimitType::Error)
|
.get_limit_mut_ref(&LimitType::Error)
|
||||||
.unwrap()
|
|
||||||
.add_remaining(-1);
|
.add_remaining(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.limits_rate
|
rate_limits
|
||||||
.get_mut(&LimitType::Global)
|
.get_limit_mut_ref(&LimitType::Global)
|
||||||
.unwrap()
|
|
||||||
.add_remaining(-1);
|
.add_remaining(-1);
|
||||||
|
|
||||||
self.limits_rate
|
rate_limits
|
||||||
.get_mut(&LimitType::Ip)
|
.get_limit_mut_ref(&LimitType::Ip)
|
||||||
.unwrap()
|
|
||||||
.add_remaining(-1);
|
.add_remaining(-1);
|
||||||
|
|
||||||
let mut_limits_rate = &mut self.limits_rate;
|
|
||||||
|
|
||||||
match limit_type {
|
match limit_type {
|
||||||
LimitType::Error => {
|
LimitType::Error => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Error).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Error);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::Global => {
|
LimitType::Global => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Global).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Global);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::Ip => {
|
LimitType::Ip => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Ip).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Ip);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::AuthLogin => {
|
LimitType::AuthLogin => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::AuthLogin).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::AuthLogin);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::AbsoluteRegister => {
|
LimitType::AbsoluteRegister => {
|
||||||
let entry = mut_limits_rate
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::AbsoluteRegister);
|
||||||
.get_mut(&LimitType::AbsoluteRegister)
|
|
||||||
.unwrap();
|
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
// AbsoluteRegister and AuthRegister both need to be updated, if a Register event
|
// AbsoluteRegister and AuthRegister both need to be updated, if a Register event
|
||||||
// happens.
|
// happens.
|
||||||
mut_limits_rate
|
rate_limits
|
||||||
.get_mut(&LimitType::AuthRegister)
|
.get_limit_mut_ref(&LimitType::AuthRegister)
|
||||||
.unwrap()
|
|
||||||
.remaining -= 1;
|
.remaining -= 1;
|
||||||
}
|
}
|
||||||
LimitType::AuthRegister => {
|
LimitType::AuthRegister => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::AuthRegister).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::AuthRegister);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
// AbsoluteRegister and AuthRegister both need to be updated, if a Register event
|
// AbsoluteRegister and AuthRegister both need to be updated, if a Register event
|
||||||
// happens.
|
// happens.
|
||||||
mut_limits_rate
|
rate_limits
|
||||||
.get_mut(&LimitType::AbsoluteRegister)
|
.get_limit_mut_ref(&LimitType::AbsoluteRegister)
|
||||||
.unwrap()
|
|
||||||
.remaining -= 1;
|
.remaining -= 1;
|
||||||
}
|
}
|
||||||
LimitType::AbsoluteMessage => {
|
LimitType::AbsoluteMessage => {
|
||||||
let entry = mut_limits_rate
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::AbsoluteMessage);
|
||||||
.get_mut(&LimitType::AbsoluteMessage)
|
|
||||||
.unwrap();
|
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::Channel => {
|
LimitType::Channel => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Channel).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Channel);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::Guild => {
|
LimitType::Guild => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Guild).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Guild);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
LimitType::Webhook => {
|
LimitType::Webhook => {
|
||||||
let entry = mut_limits_rate.get_mut(&LimitType::Webhook).unwrap();
|
let entry = rate_limits.get_limit_mut_ref(&LimitType::Webhook);
|
||||||
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
LimitedRequester::update_limit_entry(entry, reset, remaining, limit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,15 +267,6 @@ mod rate_limit {
|
||||||
String::from("http://localhost:3001/cdn"),
|
String::from("http://localhost:3001/cdn"),
|
||||||
);
|
);
|
||||||
let requester = LimitedRequester::new(urls.api).await;
|
let requester = LimitedRequester::new(urls.api).await;
|
||||||
assert_eq!(
|
|
||||||
requester.limits_rate.get(&LimitType::Ip).unwrap(),
|
|
||||||
&Limit {
|
|
||||||
bucket: LimitType::Ip,
|
|
||||||
limit: 500,
|
|
||||||
remaining: 500,
|
|
||||||
reset: 5
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
@ -268,14 +278,20 @@ mod rate_limit {
|
||||||
);
|
);
|
||||||
let mut requester = LimitedRequester::new(urls.api.clone()).await;
|
let mut requester = LimitedRequester::new(urls.api.clone()).await;
|
||||||
let mut request: Option<Result<Response, InstanceServerError>> = None;
|
let mut request: Option<Result<Response, InstanceServerError>> = None;
|
||||||
|
let mut instance_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 = requester.http.get(request_path);
|
let request_builder = requester.http.get(request_path);
|
||||||
request = Some(
|
request = Some(
|
||||||
requester
|
requester
|
||||||
.send_request(request_builder, LimitType::Channel)
|
.send_request(
|
||||||
|
request_builder,
|
||||||
|
LimitType::Channel,
|
||||||
|
&mut instance_rate_limits,
|
||||||
|
&mut user_rate_limits,
|
||||||
|
)
|
||||||
.await,
|
.await,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -296,11 +312,18 @@ 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 user_rate_limits = Limits::check_limits(urls.api.clone()).await;
|
||||||
let mut requester = LimitedRequester::new(urls.api.clone()).await;
|
let mut requester = LimitedRequester::new(urls.api.clone()).await;
|
||||||
let request_path = urls.api.clone() + "/policies/instance/limits";
|
let request_path = urls.api.clone() + "/policies/instance/limits";
|
||||||
let request_builder = requester.http.get(request_path);
|
let request_builder = requester.http.get(request_path);
|
||||||
let request = requester
|
let request = requester
|
||||||
.send_request(request_builder, LimitType::Channel)
|
.send_request(
|
||||||
|
request_builder,
|
||||||
|
LimitType::Channel,
|
||||||
|
&mut instance_rate_limits,
|
||||||
|
&mut user_rate_limits,
|
||||||
|
)
|
||||||
.await;
|
.await;
|
||||||
let result = match request {
|
let result = match request {
|
||||||
Ok(result) => result,
|
Ok(result) => result,
|
||||||
|
|
Loading…
Reference in New Issue