Refactor instance creation

This commit is contained in:
bitfl0wer 2023-12-15 00:10:33 +01:00
parent e6c627afbc
commit 1c4721a70f
5 changed files with 26 additions and 25 deletions

View File

@ -1,14 +1,8 @@
use chorus::instance::Instance; use chorus::instance::Instance;
use chorus::UrlBundle;
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() { async fn main() {
let bundle = UrlBundle::new( let instance = Instance::new("https://example.com/")
"https://example.com/api".to_string(),
"wss://example.com/".to_string(),
"https://example.com/cdn".to_string(),
);
let instance = Instance::new(bundle)
.await .await
.expect("Failed to connect to the Spacebar server"); .expect("Failed to connect to the Spacebar server");
dbg!(instance.instance_info); dbg!(instance.instance_info);

View File

@ -1,15 +1,9 @@
use chorus::instance::Instance; use chorus::instance::Instance;
use chorus::types::LoginSchema; use chorus::types::LoginSchema;
use chorus::UrlBundle;
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() { async fn main() {
let bundle = UrlBundle::new( let mut instance = Instance::new("https://example.com/")
"https://example.com/api".to_string(),
"wss://example.com/".to_string(),
"https://example.com/cdn".to_string(),
);
let mut instance = Instance::new(bundle)
.await .await
.expect("Failed to connect to the Spacebar server"); .expect("Failed to connect to the Spacebar server");
// Assume, you already have an account created on this instance. Registering an account works // Assume, you already have an account created on this instance. Registering an account works

View File

@ -73,7 +73,7 @@ impl PartialEq for LimitsInformation {
impl Instance { impl Instance {
/// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle). To create an Instance from one singular url, use [`Instance::from_root_url()`]. /// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle). To create an Instance from one singular url, use [`Instance::from_root_url()`].
pub async fn new(urls: UrlBundle) -> ChorusResult<Instance> { async fn from_url_bundle(urls: UrlBundle) -> ChorusResult<Instance> {
let is_limited: Option<LimitsConfiguration> = Instance::is_limited(&urls.api).await?; let is_limited: Option<LimitsConfiguration> = Instance::is_limited(&urls.api).await?;
let limit_information; let limit_information;
@ -114,9 +114,9 @@ impl Instance {
/// Shorthand for `Instance::new(UrlBundle::from_root_domain(root_domain).await?)`. /// Shorthand for `Instance::new(UrlBundle::from_root_domain(root_domain).await?)`.
/// ///
/// If `limited` is `true`, then Chorus will track and enforce rate limits for this instance. /// If `limited` is `true`, then Chorus will track and enforce rate limits for this instance.
pub async fn from_root_url(root_url: &str) -> ChorusResult<Instance> { pub async fn new(root_url: &str) -> ChorusResult<Instance> {
let urls = UrlBundle::from_root_url(root_url).await?; let urls = UrlBundle::from_root_url(root_url).await?;
Instance::new(urls).await Instance::from_url_bundle(urls).await
} }
pub async fn is_limited(api_url: &str) -> ChorusResult<Option<LimitsConfiguration>> { pub async fn is_limited(api_url: &str) -> ChorusResult<Option<LimitsConfiguration>> {

View File

@ -137,6 +137,12 @@ pub mod voice;
/// # Notes /// # Notes
/// All the urls can be found on the /api/policies/instance/domains endpoint of a spacebar server /// All the urls can be found on the /api/policies/instance/domains endpoint of a spacebar server
pub struct UrlBundle { pub struct UrlBundle {
/// The root url of an Instance. Usually, this would be the url where `.well-known/spacebar` can
/// be located under. If the instance you are connecting to for some reason does not have a
/// `.well-known` set up (for example, if it is a local/testing instance), you can use the api
/// url as a substitute.
/// Ex: `https://spacebar.chat`
pub root: String,
/// The api's url. /// The api's url.
/// Ex: `https://old.server.spacebar.chat/api` /// Ex: `https://old.server.spacebar.chat/api`
pub api: String, pub api: String,
@ -151,8 +157,9 @@ pub struct UrlBundle {
impl UrlBundle { impl UrlBundle {
/// Creates a new UrlBundle from the relevant urls. /// Creates a new UrlBundle from the relevant urls.
pub fn new(api: String, wss: String, cdn: String) -> Self { pub fn new(root: String, api: String, wss: String, cdn: String) -> Self {
Self { Self {
root: UrlBundle::parse_url(root),
api: UrlBundle::parse_url(api), api: UrlBundle::parse_url(api),
wss: UrlBundle::parse_url(wss), wss: UrlBundle::parse_url(wss),
cdn: UrlBundle::parse_url(cdn), cdn: UrlBundle::parse_url(cdn),
@ -237,7 +244,12 @@ impl UrlBundle {
.json::<types::types::domains_configuration::Domains>() .json::<types::types::domains_configuration::Domains>()
.await .await
{ {
Ok(UrlBundle::new(body.api_endpoint, body.gateway, body.cdn)) Ok(UrlBundle::new(
url.to_string(),
body.api_endpoint,
body.gateway,
body.cdn,
))
} else { } else {
Err(ChorusError::RequestFailed { Err(ChorusError::RequestFailed {
url: url.to_string(), url: url.to_string(),

View File

@ -52,12 +52,7 @@ impl TestBundle {
// Set up a test by creating an Instance and a User. Reduces Test boilerplate. // Set up a test by creating an Instance and a User. Reduces Test boilerplate.
pub(crate) async fn setup() -> TestBundle { pub(crate) async fn setup() -> TestBundle {
let urls = UrlBundle::new( let instance = Instance::new("http://localhost:3001/api").await.unwrap();
"http://localhost:3001/api".to_string(),
"ws://localhost:3001".to_string(),
"http://localhost:3001".to_string(),
);
let instance = Instance::new(urls.clone()).await.unwrap();
// Requires the existance of the below user. // Requires the existance of the below user.
let reg = RegisterSchema { let reg = RegisterSchema {
username: "integrationtestuser".into(), username: "integrationtestuser".into(),
@ -114,6 +109,12 @@ pub(crate) async fn setup() -> TestBundle {
.await .await
.unwrap(); .unwrap();
let urls = UrlBundle::new(
"http://localhost:3001/api".to_string(),
"http://localhost:3001/api".to_string(),
"ws://localhost:3001".to_string(),
"http://localhost:3001".to_string(),
);
TestBundle { TestBundle {
urls, urls,
user, user,