From 819eea1b4a981938446d23f122a96af0fe4aeb88 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 13 May 2025 23:23:58 -0700 Subject: [PATCH 01/41] rbx_asset: error type is too damn big --- rbx_asset/src/types.rs | 8 +++++--- rbx_asset/src/util.rs | 9 ++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/rbx_asset/src/types.rs b/rbx_asset/src/types.rs index 2aa64f5..c783ce9 100644 --- a/rbx_asset/src/types.rs +++ b/rbx_asset/src/types.rs @@ -1,14 +1,16 @@ #[allow(dead_code)] #[derive(Debug)] -pub struct StatusCodeWithUrlAndBody{ - pub status_code:reqwest::StatusCode, +pub struct UrlAndBody{ pub url:url::Url, pub body:String, } #[derive(Debug)] pub enum ResponseError{ Reqwest(reqwest::Error), - StatusCodeWithUrlAndBody(StatusCodeWithUrlAndBody), + Details{ + status_code:reqwest::StatusCode, + url_and_body:Box, + }, } impl std::fmt::Display for ResponseError{ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/rbx_asset/src/util.rs b/rbx_asset/src/util.rs index 9f8a785..bbf836f 100644 --- a/rbx_asset/src/util.rs +++ b/rbx_asset/src/util.rs @@ -1,4 +1,4 @@ -use crate::types::{ResponseError,StatusCodeWithUrlAndBody}; +use crate::types::{ResponseError,UrlAndBody}; // lazy function to draw out meaningful info from http response on failure pub(crate) async fn response_ok(response:reqwest::Response)->Result{ @@ -9,11 +9,10 @@ pub(crate) async fn response_ok(response:reqwest::Response)->Result Date: Tue, 13 May 2025 23:26:15 -0700 Subject: [PATCH 02/41] clippy fixes --- src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1272874..b9a65d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -756,10 +756,10 @@ async fn get_asset_exp_backoff( context:&CloudContext, asset_operation:&rbx_asset::cloud::AssetOperation )->Result{ - const BACKOFF_MUL:f32=1.3956124250860895286;//exp(1/3) + const BACKOFF_MUL:f32=1.395_612_5;//exp(1/3) let mut backoff=1000f32; loop{ - match asset_operation.try_get_asset(&context).await{ + match asset_operation.try_get_asset(context).await{ //try again when the operation is not done Err(rbx_asset::cloud::AssetOperationError::Operation(rbx_asset::cloud::OperationError::NotDone))=>(), //return all other results @@ -1030,7 +1030,7 @@ async fn download_list(cookie:Cookie,asset_id_file_map:AssetIDFileMap)->AResult< .buffer_unordered(CONCURRENT_REQUESTS) .for_each(|b:AResult<_>|async{ match b{ - Ok((dest,maybe_gzip))=>if let Err(e)=(async||{tokio::fs::write(dest,maybe_gzip.to_vec()?).await})().await{ + Ok((dest,maybe_gzip))=>if let Err(e)=async{tokio::fs::write(dest,maybe_gzip.to_vec()?).await}.await{ eprintln!("fs error: {}",e); }, Err(e)=>eprintln!("dl error: {}",e), @@ -1073,7 +1073,7 @@ async fn get_user_inventory_pages( config:&mut rbx_asset::cookie::UserInventoryPageRequest, )->AResult<()>{ loop{ - let page=context.get_user_inventory_page(&config).await?; + let page=context.get_user_inventory_page(config).await?; asset_list.extend(page.data); config.cursor=page.nextPageCursor; if config.cursor.is_none(){ -- 2.49.1 From 9e78be3d09caa35fcad38270d7039df2e3b6e193 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 13 May 2025 23:28:00 -0700 Subject: [PATCH 03/41] rbx_asset v0.4.5 fix error type --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85aa41b..047ca0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.4" +version = "0.4.5" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index d41d068..bc81d7d 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.4" +version = "0.4.5" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 369f19452ca451ff674c301004d89364bae50fd3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 13 May 2025 23:44:11 -0700 Subject: [PATCH 04/41] rbx_asset: omit Cursor --- rbx_asset/src/types.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rbx_asset/src/types.rs b/rbx_asset/src/types.rs index c783ce9..be75393 100644 --- a/rbx_asset/src/types.rs +++ b/rbx_asset/src/types.rs @@ -19,8 +19,6 @@ impl std::fmt::Display for ResponseError{ } impl std::error::Error for ResponseError{} -#[cfg(feature="gzip")] -use std::io::Cursor; #[cfg(feature="gzip")] use flate2::read::GzDecoder; @@ -46,7 +44,7 @@ impl MaybeGzippedBytes{ match self.bytes.get(0..2){ Some(b"\x1f\x8b")=>{ let mut buf=Vec::new(); - GzDecoder::new(Cursor::new(self.bytes.as_ref())).read_to_end(&mut buf)?; + GzDecoder::new(self.bytes.as_ref()).read_to_end(&mut buf)?; Ok(buf) }, _=>Ok(self.bytes.to_vec()) @@ -59,12 +57,12 @@ impl MaybeGzippedBytes{ #[cfg(feature="gzip")] pub fn read_with<'a,ReadGzip,ReadRaw,T>(&'a self,read_gzip:ReadGzip,read_raw:ReadRaw)->T where - ReadGzip:Fn(GzDecoder>)->T, - ReadRaw:Fn(Cursor<&'a [u8]>)->T, + ReadGzip:Fn(GzDecoder<&'a [u8]>)->T, + ReadRaw:Fn(&'a [u8])->T, { match self.bytes.get(0..2){ - Some(b"\x1f\x8b")=>read_gzip(GzDecoder::new(Cursor::new(self.bytes.as_ref()))), - _=>read_raw(Cursor::new(self.bytes.as_ref())) + Some(b"\x1f\x8b")=>read_gzip(GzDecoder::new(self.bytes.as_ref())), + _=>read_raw(self.bytes.as_ref()) } } } -- 2.49.1 From 89bbe00e3dae0881bc78524b61ab44ff5b0f06c3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 12 Jun 2025 02:33:12 +0000 Subject: [PATCH 05/41] Set Universe Asset Permissions (#17) This implements an endpoint to set universe asset permissions. Reviewed-on: https://git.itzana.me/StrafesNET/asset-tool/pulls/17 Co-authored-by: Quaternions Co-committed-by: Quaternions --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- rbx_asset/src/body.rs | 44 +++++++++++++++++++++ rbx_asset/src/cookie.rs | 88 +++++++++++++++++++++++++++++++++++++++++ rbx_asset/src/lib.rs | 1 + 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 rbx_asset/src/body.rs diff --git a/Cargo.lock b/Cargo.lock index 047ca0b..b49535d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1339,7 +1339,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.5" +version = "0.4.6" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index bc81d7d..d7c747a 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.5" +version = "0.4.6" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" diff --git a/rbx_asset/src/body.rs b/rbx_asset/src/body.rs new file mode 100644 index 0000000..bc46164 --- /dev/null +++ b/rbx_asset/src/body.rs @@ -0,0 +1,44 @@ +use reqwest::Body; + +pub trait ContentType:Into{ + fn content_type(&self)->&'static str; +} + +#[derive(Clone,Copy,Debug)] +pub struct Json(pub(crate)T); +impl> From> for Body{ + fn from(Json(value):Json)->Self{ + value.into() + } +} +impl> ContentType for Json{ + fn content_type(&self)->&'static str{ + "application/json" + } +} + +#[derive(Clone,Copy,Debug)] +pub struct Text(pub(crate)T); +impl> From> for Body{ + fn from(Text(value):Text)->Self{ + value.into() + } +} +impl> ContentType for Text{ + fn content_type(&self)->&'static str{ + "text/plain" + } +} + +#[derive(Clone,Copy,Debug)] +pub struct Binary(pub(crate)T); +impl> From> for Body{ + fn from(Binary(value):Binary)->Self{ + value.into() + } +} +impl> ContentType for Binary{ + fn content_type(&self)->&'static str{ + "application/octet-stream" + } +} diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index efee3dc..2ef2ab2 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -1,3 +1,4 @@ +use crate::body::{ContentType,Json}; use crate::util::response_ok; use crate::types::{ResponseError,MaybeGzippedBytes}; @@ -306,6 +307,58 @@ pub struct UserInventoryPageResponse{ pub data:Vec, } +#[derive(Debug)] +pub enum SetAssetsPermissionsError{ + Parse(url::ParseError), + JSONEncode(serde_json::Error), + Patch(PostError), + Response(ResponseError), + Reqwest(reqwest::Error), +} +impl std::fmt::Display for SetAssetsPermissionsError{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f,"{self:?}") + } +} +impl std::error::Error for SetAssetsPermissionsError{} + +#[derive(serde::Serialize)] +#[allow(nonstandard_style)] +struct AssetPermissions{ + assetId:u64, + grantToDependencies:bool,//true +} +#[derive(serde::Serialize)] +#[allow(nonstandard_style)] +struct SetAssetsPermissions<'a>{ + subjectType:&'a str,// "Universe" + subjectId:&'a str,// "4422715291" + action:&'a str,// "Use", + enableDeepAccessCheck:bool,//true, + requests:&'a [AssetPermissions], +} +pub struct SetAssetsPermissionsRequest<'a>{ + pub universe_id:u64, + pub asset_ids:&'a [u64], +} +impl SetAssetsPermissionsRequest<'_>{ + fn serialize(&self)->Result{ + let requests:&Vec<_>=&self.asset_ids.iter().map(|&asset_id|AssetPermissions{ + assetId:asset_id, + grantToDependencies:true, + }).collect(); + let subject_id=&self.universe_id.to_string(); + let permissions=SetAssetsPermissions{ + subjectType:"Universe", + subjectId:subject_id, + action:"Use", + enableDeepAccessCheck:true, + requests, + }; + serde_json::to_string(&permissions) + } +} + #[derive(Clone)] pub struct Cookie(String); impl Cookie{ @@ -356,6 +409,29 @@ impl Context{ Ok(resp) } + async fn patch(&self,url:url::Url,body:impl ContentType+Clone)->Result{ + let mut resp=self.client.patch(url.clone()) + .header("Cookie",self.cookie.as_str()) + .header("Content-Type",body.content_type()) + .body(body.clone()) + .send().await.map_err(PostError::Reqwest)?; + + //This is called a CSRF challenge apparently + if resp.status()==reqwest::StatusCode::FORBIDDEN{ + if let Some(csrf_token)=resp.headers().get("X-CSRF-Token"){ + resp=self.client.patch(url) + .header("X-CSRF-Token",csrf_token) + .header("Cookie",self.cookie.as_str()) + .header("Content-Type",body.content_type()) + .body(body) + .send().await.map_err(PostError::Reqwest)?; + }else{ + Err(PostError::CSRF)?; + } + } + + Ok(resp) + } pub async fn create(&self,config:CreateRequest,body:impl Into+Clone)->Result{ let mut url=reqwest::Url::parse("https://data.roblox.com/Data/Upload.ashx?json=1&type=Model&genreTypeId=1").map_err(CreateError::ParseError)?; //url borrow scope @@ -560,4 +636,16 @@ impl Context{ ).await.map_err(PageError::Response)? .json::().await.map_err(PageError::Reqwest) } + /// Used to enable an asset to be loaded onto a group game. + pub async fn set_assets_permissions(&self,config:SetAssetsPermissionsRequest<'_>)->Result<(),SetAssetsPermissionsError>{ + let url=reqwest::Url::parse("https://apis.roblox.com/asset-permissions-api/v1/assets/permissions").map_err(SetAssetsPermissionsError::Parse)?; + + let body=config.serialize().map_err(SetAssetsPermissionsError::JSONEncode)?; + + response_ok( + self.patch(url,Json(body)).await.map_err(SetAssetsPermissionsError::Patch)? + ).await.map_err(SetAssetsPermissionsError::Response)?; + + Ok(()) + } } diff --git a/rbx_asset/src/lib.rs b/rbx_asset/src/lib.rs index a6a3487..76136e9 100644 --- a/rbx_asset/src/lib.rs +++ b/rbx_asset/src/lib.rs @@ -1,4 +1,5 @@ pub mod cloud; pub mod cookie; pub mod types; +mod body; mod util; -- 2.49.1 From f2bd298cd116037566559cf8871611d03bb06495 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 11 Jun 2025 23:33:58 -0700 Subject: [PATCH 06/41] rbx_asset: try out ref for funsies --- rbx_asset/src/cookie.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 2ef2ab2..3d14acc 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -343,19 +343,19 @@ pub struct SetAssetsPermissionsRequest<'a>{ } impl SetAssetsPermissionsRequest<'_>{ fn serialize(&self)->Result{ - let requests:&Vec<_>=&self.asset_ids.iter().map(|&asset_id|AssetPermissions{ + let ref requests:Vec<_>=self.asset_ids.iter().map(|&asset_id|AssetPermissions{ assetId:asset_id, grantToDependencies:true, }).collect(); - let subject_id=&self.universe_id.to_string(); - let permissions=SetAssetsPermissions{ + let ref subject_id=self.universe_id.to_string(); + let ref permissions=SetAssetsPermissions{ subjectType:"Universe", subjectId:subject_id, action:"Use", enableDeepAccessCheck:true, requests, }; - serde_json::to_string(&permissions) + serde_json::to_string(permissions) } } -- 2.49.1 From 52a0bf221bf3cdae20fc1aa7f442d2bd4aa5fc5e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 11 Jun 2025 23:34:14 -0700 Subject: [PATCH 07/41] rbx_asset: visibility mistake --- rbx_asset/src/cookie.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 3d14acc..17ca4d2 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -283,21 +283,21 @@ pub struct UserInventoryPageRequest{ #[derive(serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] pub struct UserInventoryItemOwner{ - userId:u64, - username:String, - buildersClubMembershipType:u64, + pub userId:u64, + pub username:String, + pub buildersClubMembershipType:u64, } #[derive(serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] pub struct UserInventoryItem{ - userAssetId:u64, - assetId:u64, - assetName:String, - collectibleItemId:Option, - collectibleItemInstanceId:Option, - owner:UserInventoryItemOwner, - created:chrono::DateTime, - updated:chrono::DateTime, + pub userAssetId:u64, + pub assetId:u64, + pub assetName:String, + pub collectibleItemId:Option, + pub collectibleItemInstanceId:Option, + pub owner:UserInventoryItemOwner, + pub created:chrono::DateTime, + pub updated:chrono::DateTime, } #[derive(serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] -- 2.49.1 From 41cd60c459007978687f5aa3677eaff90abba2cf Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 13 Jun 2025 20:04:07 -0700 Subject: [PATCH 08/41] untab --- src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index b9a65d3..571bd99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1029,13 +1029,13 @@ async fn download_list(cookie:Cookie,asset_id_file_map:AssetIDFileMap)->AResult< })) .buffer_unordered(CONCURRENT_REQUESTS) .for_each(|b:AResult<_>|async{ - match b{ - Ok((dest,maybe_gzip))=>if let Err(e)=async{tokio::fs::write(dest,maybe_gzip.to_vec()?).await}.await{ - eprintln!("fs error: {}",e); - }, - Err(e)=>eprintln!("dl error: {}",e), - } - }).await; + match b{ + Ok((dest,maybe_gzip))=>if let Err(e)=async{tokio::fs::write(dest,maybe_gzip.to_vec()?).await}.await{ + eprintln!("fs error: {}",e); + }, + Err(e)=>eprintln!("dl error: {}",e), + } + }).await; Ok(()) } -- 2.49.1 From 0bf0b92efb0102b1795436f008c5f3522017e9c6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 13 Jun 2025 20:04:18 -0700 Subject: [PATCH 09/41] asset location commands --- src/main.rs | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/src/main.rs b/src/main.rs index 571bd99..68d4998 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,8 @@ enum Commands{ DownloadHistory(DownloadHistorySubcommand), Download(DownloadSubcommand), DownloadVersion(DownloadVersionSubcommand), + DownloadLocation(DownloadLocationSubcommand), + DownloadVersionLocation(DownloadVersionLocationSubcommand), DownloadVersionV2(DownloadVersionSubcommand), DownloadDecompile(DownloadDecompileSubcommand), DownloadCreationsJson(DownloadCreationsJsonSubcommand), @@ -104,6 +106,32 @@ struct DownloadVersionSubcommand{ #[arg(long)] asset_version:Option, } +/// Get download urls for a list of assets by id. +#[derive(Args)] +struct DownloadLocationSubcommand{ + #[arg(long,group="api_key",required=true)] + api_key_literal:Option, + #[arg(long,group="api_key",required=true)] + api_key_envvar:Option, + #[arg(long,group="api_key",required=true)] + api_key_file:Option, + #[arg(required=true)] + asset_ids:Vec, +} +/// Get a download url for a single asset by id, optionally specifying the version to download. +#[derive(Args)] +struct DownloadVersionLocationSubcommand{ + #[arg(long,group="api_key",required=true)] + api_key_literal:Option, + #[arg(long,group="api_key",required=true)] + api_key_envvar:Option, + #[arg(long,group="api_key",required=true)] + api_key_file:Option, + #[arg(long)] + asset_id:AssetID, + #[arg(long)] + asset_version:Option, +} /// Download the list of asset ids (not the assets themselves) created by a group or user. The output is written to `output_folder/versions.json` #[derive(Args)] struct DownloadCreationsJsonSubcommand{ @@ -489,6 +517,27 @@ async fn main()->AResult<()>{ }, ).await }, + Commands::DownloadLocation(subcommand)=>{ + download_list_locations( + api_key_from_args( + subcommand.api_key_literal, + subcommand.api_key_envvar, + subcommand.api_key_file, + ).await?, + &subcommand.asset_ids + ).await + }, + Commands::DownloadVersionLocation(subcommand)=>{ + download_location( + api_key_from_args( + subcommand.api_key_literal, + subcommand.api_key_envvar, + subcommand.api_key_file, + ).await?, + subcommand.asset_id, + subcommand.asset_version, + ).await + }, Commands::DownloadVersionV2(subcommand)=>{ let output_folder=subcommand.output_folder.unwrap_or_else(||std::env::current_dir().unwrap()); download_version_v2( @@ -1039,6 +1088,38 @@ async fn download_list(cookie:Cookie,asset_id_file_map:AssetIDFileMap)->AResult< Ok(()) } +async fn download_list_locations(api_key:ApiKey,asset_id_file_map:&[u64])->AResult<()>{ + let context=CloudContext::new(api_key); + futures::stream::iter(asset_id_file_map) + .map(|&asset_id| + context.get_asset_location(rbx_asset::cloud::GetAssetLatestRequest{asset_id}) + ) + .buffer_unordered(CONCURRENT_REQUESTS) + .for_each(|result|async{ + match result{ + Ok(asset_location_info)=>match asset_location_info.location{ + Some(location)=>println!("{}",location.location()), + None=>println!("This asset is private!"), + }, + Err(e)=>eprintln!("dl error: {}",e), + } + }).await; + Ok(()) +} + +async fn download_location(api_key:ApiKey,asset_id:AssetID,version:Option)->AResult<()>{ + let context=CloudContext::new(api_key); + let asset_location_info=match version{ + Some(version)=>context.get_asset_version_location(rbx_asset::cloud::GetAssetVersionRequest{asset_id,version}).await?, + None=>context.get_asset_location(rbx_asset::cloud::GetAssetLatestRequest{asset_id}).await?, + }; + match asset_location_info.location{ + Some(location)=>println!("{}",location.location()), + None=>println!("This asset is private!"), + } + Ok(()) +} + async fn get_creations_pages(context:&CookieContext,owner:rbx_asset::cookie::Owner)->AResult>{ let mut config=rbx_asset::cookie::CreationsPageRequest{ owner, -- 2.49.1 From 9f1bdd6a1fd115145d6eaf301c1b65b4660058bf Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 1 Jul 2025 01:08:51 -0700 Subject: [PATCH 10/41] rbx_asset: roblox api changed --- rbx_asset/src/cloud.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 71f4a9e..3a609d2 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -195,15 +195,21 @@ impl AssetLocation{ } } +#[derive(Debug,serde::Deserialize)] +#[allow(nonstandard_style,dead_code)] +pub struct AssetMetadata{ + pub metadataType:u32, + pub value:String, +} #[derive(Debug,serde::Deserialize)] #[allow(nonstandard_style,dead_code)] pub struct AssetLocationInfo{ pub location:Option, pub requestId:String, - pub IsHashDynamic:bool, - pub IsCopyrightProtected:bool, pub isArchived:bool, pub assetTypeId:u32, + pub assetMetadatas:Vec, + pub isRecordable:bool, } pub struct AssetVersionsRequest{ -- 2.49.1 From ad435fb8c9ceabb4414e9dafaf0df983a8bc813e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 1 Jul 2025 01:12:40 -0700 Subject: [PATCH 11/41] update deps --- Cargo.lock | 535 ++++++++++++++++++++++++++--------------------------- 1 file changed, 259 insertions(+), 276 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b49535d..0f82edc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,21 +13,21 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.16", + "getrandom 0.3.3", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -71,36 +71,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -149,15 +149,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -188,9 +188,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "blake3" @@ -207,9 +207,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -225,9 +225,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.20" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "jobserver", "libc", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "chrono" @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", "clap_derive", @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -279,9 +279,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" dependencies = [ "heck", "proc-macro2", @@ -291,15 +291,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "constant_time_eq" @@ -391,12 +391,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -407,9 +407,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -542,14 +542,14 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", @@ -565,11 +565,11 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git2" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5220b8ba44c68a9a7f7a7659e864dd73692e417ef0211bea133c7b74e031eeb9" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", "libgit2-sys", "log", @@ -580,9 +580,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -599,9 +599,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "heck" @@ -671,11 +671,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -704,22 +703,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -748,21 +753,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -771,31 +777,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -803,67 +789,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "idna" version = "1.0.3" @@ -877,9 +850,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -887,9 +860,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", @@ -901,6 +874,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -919,7 +902,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -964,15 +947,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libgit2-sys" -version = "0.18.1+1.9.0" +version = "0.18.2+1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dcb20f84ffcdd825c7a311ae347cce604a6f084a767dec4a4929829645290e" +checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" dependencies = [ "cc", "libc", @@ -1016,15 +999,15 @@ checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1057,9 +1040,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mime" @@ -1079,22 +1062,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -1139,12 +1122,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "openssl" -version = "0.10.72" +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -1172,9 +1161,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -1184,9 +1173,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1194,9 +1183,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -1235,13 +1224,22 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.25", + "zerocopy", ] [[package]] @@ -1255,18 +1253,18 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", "syn", @@ -1283,9 +1281,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -1434,11 +1432,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -1472,9 +1470,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "4c8cea6b35bcceb099f30173754403d2eba0a5dc18cea3630fccd88251909288" dependencies = [ "base64 0.22.1", "bytes", @@ -1489,30 +1487,27 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "mime_guess", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] @@ -1565,9 +1560,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustix" @@ -1575,7 +1570,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", @@ -1584,9 +1579,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "once_cell", "rustls-pki-types", @@ -1596,25 +1591,19 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "rustls-pki-types", + "zeroize", ] -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -1623,9 +1612,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -1654,7 +1643,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -1723,24 +1712,21 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1766,9 +1752,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1801,7 +1787,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "system-configuration-sys", ] @@ -1818,12 +1804,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1851,9 +1837,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -1861,9 +1847,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -1934,6 +1920,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1958,9 +1962,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -2013,12 +2017,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2054,9 +2052,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -2150,15 +2148,15 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings", ] [[package]] @@ -2185,44 +2183,35 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ + "windows-link", "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -2245,6 +2234,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2263,9 +2261,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", @@ -2379,20 +2377,14 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" @@ -2402,9 +2394,9 @@ checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -2414,9 +2406,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -2426,38 +2418,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive 0.8.25", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", @@ -2492,10 +2464,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -2504,9 +2487,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", -- 2.49.1 From d60cedf43000355d140d26b288d9cfbe0b4a28f3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 1 Jul 2025 01:12:09 -0700 Subject: [PATCH 12/41] rbx_asset: v0.4.7 roblox api changed --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f82edc..d6db06c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1337,7 +1337,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.6" +version = "0.4.7" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index d7c747a..d4865e7 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.6" +version = "0.4.7" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 20899a3faed58ca78e8a83fb09768aed24f41562 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 1 Jul 2025 04:55:56 -0700 Subject: [PATCH 13/41] rbx_asset: default field --- rbx_asset/src/cloud.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 3a609d2..ab0691a 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -208,6 +208,7 @@ pub struct AssetLocationInfo{ pub requestId:String, pub isArchived:bool, pub assetTypeId:u32, + #[serde(default)] pub assetMetadatas:Vec, pub isRecordable:bool, } -- 2.49.1 From bf3b429c665318bf9296fe8538f45ea7e6e31cde Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 1 Jul 2025 04:56:23 -0700 Subject: [PATCH 14/41] rbx_asset v0.4.8 default field --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6db06c..4910342 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1337,7 +1337,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.7" +version = "0.4.8" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index d4865e7..2cf497a 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.7" +version = "0.4.8" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From b3defd31fce7fa0524752c044bff14e531204d77 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 5 Aug 2025 21:08:23 -0700 Subject: [PATCH 15/41] replace allow with expect --- rbx_asset/src/types.rs | 2 +- rox_compiler/src/compile.rs | 2 +- src/main.rs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rbx_asset/src/types.rs b/rbx_asset/src/types.rs index be75393..b7b8ea3 100644 --- a/rbx_asset/src/types.rs +++ b/rbx_asset/src/types.rs @@ -1,4 +1,4 @@ -#[allow(dead_code)] +#[expect(dead_code)] #[derive(Debug)] pub struct UrlAndBody{ pub url:url::Url, diff --git a/rox_compiler/src/compile.rs b/rox_compiler/src/compile.rs index ffa1c21..fd8744f 100644 --- a/rox_compiler/src/compile.rs +++ b/rox_compiler/src/compile.rs @@ -16,7 +16,7 @@ use crate::common::{sanitize,Style,PropertiesOverride}; //I could use a function! //eventually: #[derive(Debug)] -#[allow(dead_code)]//idk why this thinks it's dead code, the errors are printed out in various places +#[expect(dead_code)]//idk why this thinks it's dead code, the errors are printed out in various places pub enum QueryResolveError{ NotFound,//0 results Ambiguous,//>1 results diff --git a/src/main.rs b/src/main.rs index 68d4998..0992465 100644 --- a/src/main.rs +++ b/src/main.rs @@ -851,7 +851,7 @@ struct CreateAssetMediasConfig{ } #[derive(Debug)] -#[allow(dead_code)] +#[expect(dead_code)] enum CreateAssetMediasError{ NoFileStem(PathBuf), IO(std::io::Error), @@ -866,7 +866,7 @@ impl std::fmt::Display for CreateAssetMediasError{ impl std::error::Error for CreateAssetMediasError{} #[derive(Debug)] -#[allow(dead_code)] +#[expect(dead_code)] enum PollOperationError{ CreateAssetMedias(CreateAssetMediasError), AssetOperation(rbx_asset::cloud::AssetOperationError), @@ -879,7 +879,7 @@ impl std::fmt::Display for PollOperationError{ impl std::error::Error for PollOperationError{} #[derive(Debug)] -#[allow(dead_code)] +#[expect(dead_code)] enum DownloadDecalError{ PollOperation(PollOperationError), ParseInt(std::num::ParseIntError), @@ -1361,7 +1361,7 @@ async fn download_history(mut config:DownloadHistoryConfig)->AResult<()>{ } #[derive(Debug)] -#[allow(dead_code)] +#[expect(dead_code)] enum LoadDomError{ IO(std::io::Error), RbxBinary(rbx_binary::DecodeError), -- 2.49.1 From c1e53e42bc773722fdb617b338ad5b419cb5abe9 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 5 Aug 2025 21:09:47 -0700 Subject: [PATCH 16/41] remove attributes OBE --- rbx_asset/src/types.rs | 1 - rox_compiler/src/compile.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/rbx_asset/src/types.rs b/rbx_asset/src/types.rs index b7b8ea3..e1bded8 100644 --- a/rbx_asset/src/types.rs +++ b/rbx_asset/src/types.rs @@ -1,4 +1,3 @@ -#[expect(dead_code)] #[derive(Debug)] pub struct UrlAndBody{ pub url:url::Url, diff --git a/rox_compiler/src/compile.rs b/rox_compiler/src/compile.rs index fd8744f..b8f43d6 100644 --- a/rox_compiler/src/compile.rs +++ b/rox_compiler/src/compile.rs @@ -16,7 +16,6 @@ use crate::common::{sanitize,Style,PropertiesOverride}; //I could use a function! //eventually: #[derive(Debug)] -#[expect(dead_code)]//idk why this thinks it's dead code, the errors are printed out in various places pub enum QueryResolveError{ NotFound,//0 results Ambiguous,//>1 results -- 2.49.1 From d73567050c1977304838adc35c320913c2a0e250 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 5 Aug 2025 21:14:30 -0700 Subject: [PATCH 17/41] update deps --- Cargo.lock | 114 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4910342..451c1a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -86,22 +86,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -225,9 +225,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" dependencies = [ "jobserver", "libc", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" dependencies = [ "clap_builder", "clap_derive", @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" dependencies = [ "anstream", "anstyle", @@ -279,9 +279,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck", "proc-macro2", @@ -325,9 +325,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -703,9 +703,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -868,6 +868,17 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -1432,9 +1443,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] @@ -1470,9 +1481,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.21" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8cea6b35bcceb099f30173754403d2eba0a5dc18cea3630fccd88251909288" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", @@ -1560,28 +1571,28 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "rustls-pki-types", @@ -1601,9 +1612,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring", "rustls-pki-types", @@ -1682,9 +1693,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -1724,12 +1735,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1847,18 +1858,20 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", + "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1894,9 +1907,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2240,7 +2253,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -2261,10 +2274,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -2388,9 +2402,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "yoke" @@ -2476,9 +2490,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", -- 2.49.1 From 10c9ddd6969083ad7511b2a6d80607722a97e7fa Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 5 Aug 2025 21:17:01 -0700 Subject: [PATCH 18/41] goofy feature stuff --- Cargo.lock | 197 ++++++++++++++++++++++++++++++++++++++++--- rbx_asset/Cargo.toml | 11 ++- 2 files changed, 196 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 451c1a8..003fdf9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,6 +240,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.41" @@ -541,8 +547,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -552,9 +560,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -683,6 +693,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", + "webpki-roots", ] [[package]] @@ -719,7 +730,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "system-configuration", "tokio", "tower-service", @@ -1030,6 +1041,12 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "lz4" version = "1.28.1" @@ -1281,6 +1298,61 @@ dependencies = [ "syn", ] +[[package]] +name = "quinn" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.5.10", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.40" @@ -1303,8 +1375,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1314,7 +1396,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1326,6 +1418,15 @@ dependencies = [ "getrandom 0.2.16", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + [[package]] name = "rayon" version = "1.10.0" @@ -1372,7 +1473,7 @@ dependencies = [ "rbx_dom_weak", "rbx_reflection", "rbx_reflection_database", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -1396,7 +1497,7 @@ checksum = "1b6d0d62baa613556b058a5f94a53b01cf0ccde0ea327ce03056e335b982e77e" dependencies = [ "rbx_types", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1421,9 +1522,9 @@ dependencies = [ "bitflags 1.3.2", "blake3", "lazy_static", - "rand", + "rand 0.8.5", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1505,6 +1606,8 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", "rustls-pki-types", "serde", "serde_json", @@ -1512,6 +1615,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -1519,6 +1623,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", ] [[package]] @@ -1575,6 +1680,12 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustix" version = "1.0.8" @@ -1595,6 +1706,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1607,6 +1719,7 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ + "web-time", "zeroize", ] @@ -1733,6 +1846,16 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "socket2" version = "0.6.0" @@ -1832,7 +1955,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -1846,6 +1978,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -1856,6 +1999,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.47.1" @@ -1869,7 +2027,7 @@ dependencies = [ "mio", "pin-project-lite", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", "windows-sys 0.59.0", ] @@ -2159,6 +2317,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "windows-core" version = "0.61.2" diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index 2cf497a..85d49ee 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -11,14 +11,21 @@ authors = ["Rhys Lloyd "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["gzip"] +default = ["gzip", "default-tls"] gzip = ["dep:flate2"] +default-tls = ["reqwest/default-tls"] +rustls-tls = ["reqwest/rustls-tls"] + [dependencies] bytes = "1.10.1" chrono = { version = "0.4.38", features = ["serde"] } flate2 = { version = "1.0.29", optional = true } -reqwest = { version = "0.12.4", features = ["json","multipart"] } +reqwest = { version = "0.12.4", features = [ + "json", "multipart", + # default features + "charset", "http2", "system-proxy" +], default-features = false } serde = { version = "1.0.199", features = ["derive"] } serde_json = "1.0.111" url = "2.5.0" -- 2.49.1 From f3f048e293c7f6c40bd7eb69ceb8f6f9d95b7535 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Tue, 5 Aug 2025 21:20:31 -0700 Subject: [PATCH 19/41] v0.4.9 rustls passthru --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 003fdf9..77702ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.8" +version = "0.4.9" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index 85d49ee..beb94ec 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.8" +version = "0.4.9" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 6dff5f5145074d8f8cdc1a9128931afa0b17fd89 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 16:59:24 -0700 Subject: [PATCH 20/41] rbx_asset: relax operation allocation requirement --- rbx_asset/src/cloud.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index ab0691a..6215ebb 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -117,8 +117,8 @@ impl std::fmt::Display for UpdateError{ } impl std::error::Error for UpdateError{} -struct GetAssetOperationRequest{ - operation_id:String, +struct GetAssetOperationRequest<'a>{ + operation_id:&'a str, } pub struct GetAssetLatestRequest{ pub asset_id:u64, @@ -320,8 +320,7 @@ impl RobloxOperation{ pub async fn try_get_reponse(&self,context:&Context)->Result{ context.get_asset_operation(GetAssetOperationRequest{ operation_id:self.operation_id() - .ok_or(OperationError::NoOperationId)? - .to_owned(), + .ok_or(OperationError::NoOperationId)?, }).await.map_err(OperationError::Get)? .response.ok_or(OperationError::NotDone) } @@ -415,7 +414,7 @@ impl Context{ operation, }) } - async fn get_asset_operation(&self,config:GetAssetOperationRequest)->Result{ + async fn get_asset_operation(&self,config:GetAssetOperationRequest<'_>)->Result{ let raw_url=format!("https://apis.roblox.com/assets/v1/operations/{}",config.operation_id); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; -- 2.49.1 From 8a400faae252875faa157f31aa8f1814bbc4b2c5 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 17:33:26 -0700 Subject: [PATCH 21/41] rbx_asset: rename GetError variant --- rbx_asset/src/cloud.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 6215ebb..acaa7d6 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -172,7 +172,7 @@ pub struct GetAssetVersionRequest{ } #[derive(Debug)] pub enum GetError{ - ParseError(url::ParseError), + Parse(url::ParseError), Response(ResponseError), Reqwest(reqwest::Error), } @@ -416,7 +416,7 @@ impl Context{ } async fn get_asset_operation(&self,config:GetAssetOperationRequest<'_>)->Result{ let raw_url=format!("https://apis.roblox.com/assets/v1/operations/{}",config.operation_id); - let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; response_ok( self.get(url).await.map_err(GetError::Reqwest)? @@ -425,7 +425,7 @@ impl Context{ } pub async fn get_asset_info(&self,config:GetAssetLatestRequest)->Result{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}",config.asset_id); - let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; response_ok( self.get(url).await.map_err(GetError::Reqwest)? @@ -434,7 +434,7 @@ impl Context{ } pub async fn get_asset_version_info(&self,config:GetAssetVersionRequest)->Result{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}/versions/{}",config.asset_id,config.version); - let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; response_ok( self.get(url).await.map_err(GetError::Reqwest)? @@ -443,7 +443,7 @@ impl Context{ } pub async fn get_asset_location(&self,config:GetAssetLatestRequest)->Result{ let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}",config.asset_id); - let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; response_ok( self.get(url).await.map_err(GetError::Reqwest)? @@ -452,7 +452,7 @@ impl Context{ } pub async fn get_asset_version_location(&self,config:GetAssetVersionRequest)->Result{ let raw_url=format!("https://apis.roblox.com/asset-delivery-api/v1/assetId/{}/version/{}",config.asset_id,config.version); - let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; response_ok( self.get(url).await.map_err(GetError::Reqwest)? @@ -460,7 +460,7 @@ impl Context{ .json().await.map_err(GetError::Reqwest) } pub async fn get_asset(&self,config:&AssetLocation)->Result{ - let url=reqwest::Url::parse(config.location()).map_err(GetError::ParseError)?; + let url=reqwest::Url::parse(config.location()).map_err(GetError::Parse)?; let bytes=response_ok( self.get(url).await.map_err(GetError::Reqwest)? -- 2.49.1 From dd4344f514a5b96cb133080dc5f67368160ff13a Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Sat, 9 Aug 2025 03:26:03 +0000 Subject: [PATCH 22/41] Luau Execution API (#18) Tested to some extent Reviewed-on: https://git.itzana.me/StrafesNET/asset-tool/pulls/18 Co-authored-by: Rhys Lloyd Co-committed-by: Rhys Lloyd --- rbx_asset/src/cloud.rs | 122 ++++++++++++++++++++++++++++++++++++++++- src/main.rs | 77 ++++++++++++++++++++++++++ 2 files changed, 197 insertions(+), 2 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index acaa7d6..3f79365 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -1,3 +1,4 @@ +use crate::body::{Binary,ContentType,Json}; use crate::util::{serialize_u64,deserialize_u64,response_ok}; use crate::types::{ResponseError,MaybeGzippedBytes}; @@ -326,6 +327,102 @@ impl RobloxOperation{ } } +#[derive(Debug)] +pub enum LuauSessionError{ + Get(GetError), + Unspecified, + NotDone, + NoOutput, + NoError, +} +impl std::fmt::Display for LuauSessionError{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f,"{self:?}") + } +} +impl std::error::Error for LuauSessionError{} +#[derive(Debug,serde::Serialize)] +#[expect(nonstandard_style)] +pub struct LuauSessionCreate<'a>{ + pub script:&'a str, + #[serde(skip_serializing_if="Option::is_none")] + pub user:Option<&'a str>, + #[serde(skip_serializing_if="Option::is_none")] + pub timeout:Option<&'a str>, + #[serde(skip_serializing_if="Option::is_none")] + pub binaryInput:Option<&'a str>, + #[serde(skip_serializing_if="Option::is_none")] + pub enableBinaryOutput:Option, + #[serde(skip_serializing_if="Option::is_none")] + pub binaryOutputUri:Option<&'a str>, +} +#[derive(Debug,serde::Deserialize)] +#[expect(nonstandard_style)] +pub enum LuauSessionState{ + STATE_UNSPECIFIED, + PROCESSING, + COMPLETE, + FAILED, +} +#[derive(Debug,serde::Deserialize)] +pub struct LuauError{ + pub code:String, + pub message:String, +} +#[derive(Debug,serde::Deserialize)] +pub struct LuauResults{ + pub results:Vec, +} +#[derive(Debug,serde::Deserialize)] +#[expect(nonstandard_style)] +pub struct LuauSessionResponse{ + path:String, + #[serde(deserialize_with="deserialize_u64")] + pub user:u64, + pub state:LuauSessionState, + pub script:String, + pub error:Option, + pub output:Option, + pub binaryInput:String, + pub enableBinaryOutput:bool, + pub binaryOutputUri:String, +} +impl LuauSessionResponse{ + pub fn path(&self)->&str{ + &self.path + } + pub async fn try_get_result(&self,context:&Context)->Result,LuauSessionError>{ + let response=context.get_luau_session(self).await.map_err(LuauSessionError::Get)?; + match response.state{ + LuauSessionState::STATE_UNSPECIFIED=>Err(LuauSessionError::Unspecified), + LuauSessionState::PROCESSING=>Err(LuauSessionError::NotDone), + LuauSessionState::COMPLETE=>Ok(Ok(response.output.ok_or(LuauSessionError::NoOutput)?)), + LuauSessionState::FAILED=>Ok(Err(response.error.ok_or(LuauSessionError::NoError)?)), + } + } +} +pub trait AsSessionPath{ + fn into_session_path(&self)->impl AsRef; +} +impl AsSessionPath for LuauSessionResponse{ + fn into_session_path(&self)->impl AsRef{ + &self.path + } +} +pub struct LuauSessionRequest{ + pub universe_id:u64, + pub place_id:u64, + pub version_id:u64, +} +impl AsSessionPath for LuauSessionRequest{ + fn into_session_path(&self)->impl AsRef{ + let universe_id=self.universe_id; + let place_id=self.place_id; + let version_id=self.version_id; + format!("universes/{universe_id}/places/{place_id}/versions/{version_id}/luau-execution-session-tasks") + } +} + #[derive(Clone)] pub struct ApiKey(String); impl ApiKey{ @@ -355,9 +452,10 @@ impl Context{ .header("x-api-key",self.api_key.as_str()) .send().await } - async fn post(&self,url:url::Url,body:impl Into+Clone)->Result{ + async fn post(&self,url:url::Url,body:impl ContentType)->Result{ self.client.post(url) .header("x-api-key",self.api_key.as_str()) + .header("Content-Type",body.content_type()) .body(body) .send().await } @@ -423,6 +521,26 @@ impl Context{ ).await.map_err(GetError::Response)? .json::().await.map_err(GetError::Reqwest) } + pub async fn create_luau_session(&self,config:&impl AsSessionPath,session:LuauSessionCreate<'_>)->Result{ + let raw_url=format!("https://apis.roblox.com/cloud/v2/{}",config.into_session_path().as_ref()); + let url=reqwest::Url::parse(raw_url.as_str()).map_err(CreateError::Parse)?; + + let body=serde_json::to_string(&session).map_err(CreateError::Serialize)?; + + response_ok( + self.post(url,Json(body)).await.map_err(CreateError::Reqwest)? + ).await.map_err(CreateError::Response)? + .json::().await.map_err(CreateError::Reqwest) + } + pub async fn get_luau_session(&self,config:&impl AsSessionPath)->Result{ + let raw_url=format!("https://apis.roblox.com/cloud/v2/{}",config.into_session_path().as_ref()); + let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; + + response_ok( + self.get(url).await.map_err(GetError::Reqwest)? + ).await.map_err(GetError::Response)? + .json::().await.map_err(GetError::Reqwest) + } pub async fn get_asset_info(&self,config:GetAssetLatestRequest)->Result{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}",config.asset_id); let url=reqwest::Url::parse(raw_url.as_str()).map_err(GetError::Parse)?; @@ -503,7 +621,7 @@ impl Context{ } response_ok( - self.post(url,body).await.map_err(UpdateError::Reqwest)? + self.post(url,Binary(body)).await.map_err(UpdateError::Reqwest)? ).await.map_err(UpdateError::Response)? .json::().await.map_err(UpdateError::Reqwest) } diff --git a/src/main.rs b/src/main.rs index 0992465..6412fc0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,6 +42,7 @@ enum Commands{ Decompile(DecompileSubcommand), DecompileHistoryIntoGit(DecompileHistoryIntoGitSubcommand), DownloadAndDecompileHistoryIntoGit(DownloadAndDecompileHistoryIntoGitSubcommand), + RunLuau(RunLuauSubcommand), } /// Download a range of assets from the asset version history. Download summary is saved to `output_folder/versions.json`, and can be optionally used to download only new versions the next time. @@ -427,6 +428,26 @@ struct DownloadAndDecompileHistoryIntoGitSubcommand{ #[arg(long)] write_scripts:Option, } +/// Run a Luau script. +#[derive(Args)] +struct RunLuauSubcommand{ + #[arg(long,group="api_key",required=true)] + api_key_literal:Option, + #[arg(long,group="api_key",required=true)] + api_key_envvar:Option, + #[arg(long,group="api_key",required=true)] + api_key_file:Option, + #[arg(long,group="script",required=true)] + script_literal:Option, + #[arg(long,group="script",required=true)] + script_file:Option, + #[arg(long)] + universe_id:u64, + #[arg(long)] + place_id:u64, + #[arg(long)] + version_id:u64, +} #[derive(Clone,Copy,Debug,clap::ValueEnum)] enum Style{ @@ -738,6 +759,22 @@ async fn main()->AResult<()>{ write_models:subcommand.write_models.unwrap_or(false), write_scripts:subcommand.write_scripts.unwrap_or(true), }).await, + Commands::RunLuau(subcommand)=>run_luau(RunLuauConfig{ + api_key:api_key_from_args( + subcommand.api_key_literal, + subcommand.api_key_envvar, + subcommand.api_key_file, + ).await?, + script:match subcommand.script_literal{ + Some(script)=>script, + None=>std::fs::read_to_string(subcommand.script_file.unwrap())?, + }, + request:rbx_asset::cloud::LuauSessionRequest{ + place_id:subcommand.place_id, + universe_id:subcommand.universe_id, + version_id:subcommand.version_id, + }, + }).await, } } @@ -1744,3 +1781,43 @@ async fn compile_upload_place(config:CompileUploadPlaceConfig)->AResult<()>{ println!("UploadResponse={:?}",resp); Ok(()) } + +async fn get_luau_result_exp_backoff( + context:&CloudContext, + luau_session:&rbx_asset::cloud::LuauSessionResponse +)->Result,rbx_asset::cloud::LuauSessionError>{ + const BACKOFF_MUL:f32=1.395_612_5;//exp(1/3) + let mut backoff=1000f32; + loop{ + match luau_session.try_get_result(context).await{ + //try again when the operation is not done + Err(rbx_asset::cloud::LuauSessionError::NotDone)=>(), + //return all other results + other_result=>return other_result, + } + println!("Operation not complete; waiting {:.0}ms...",backoff); + tokio::time::sleep(std::time::Duration::from_millis(backoff as u64)).await; + backoff*=BACKOFF_MUL; + } +} +struct RunLuauConfig{ + api_key:ApiKey, + script:String, + request:rbx_asset::cloud::LuauSessionRequest, +} +async fn run_luau(config:RunLuauConfig)->AResult<()>{ + let context=CloudContext::new(config.api_key); + let session=rbx_asset::cloud::LuauSessionCreate{ + script:&config.script, + user:None, + timeout:None, + binaryInput:None, + enableBinaryOutput:None, + binaryOutputUri:None, + }; + let response=context.create_luau_session(&config.request,session).await?; + dbg!(&response); + let result=get_luau_result_exp_backoff(&context,&response).await?; + dbg!(&result); + Ok(()) +} -- 2.49.1 From 6b9ae59e7f48fc6c73b2419cd40fbb657b76a392 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 20:27:46 -0700 Subject: [PATCH 23/41] v0.4.10-pre1 Luau Execution API --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 77702ca..33f9ccb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.9" +version = "0.4.10-pre1" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index beb94ec..dc9d74e 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.9" +version = "0.4.10-pre1" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 89d96db03ca4f622b581b0ff0c8e928a0349d8b4 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 20:32:52 -0700 Subject: [PATCH 24/41] rbx_asset: unversioned request --- rbx_asset/src/cloud.rs | 13 ++++++++++++- src/main.rs | 3 --- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 3f79365..5ce0297 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -412,9 +412,20 @@ impl AsSessionPath for LuauSessionResponse{ pub struct LuauSessionRequest{ pub universe_id:u64, pub place_id:u64, - pub version_id:u64, } impl AsSessionPath for LuauSessionRequest{ + fn into_session_path(&self)->impl AsRef{ + let universe_id=self.universe_id; + let place_id=self.place_id; + format!("universes/{universe_id}/places/{place_id}/luau-execution-session-tasks") + } +} +pub struct LuauSessionVersionRequest{ + pub universe_id:u64, + pub place_id:u64, + pub version_id:u64, +} +impl AsSessionPath for LuauSessionVersionRequest{ fn into_session_path(&self)->impl AsRef{ let universe_id=self.universe_id; let place_id=self.place_id; diff --git a/src/main.rs b/src/main.rs index 6412fc0..d770983 100644 --- a/src/main.rs +++ b/src/main.rs @@ -445,8 +445,6 @@ struct RunLuauSubcommand{ universe_id:u64, #[arg(long)] place_id:u64, - #[arg(long)] - version_id:u64, } #[derive(Clone,Copy,Debug,clap::ValueEnum)] @@ -772,7 +770,6 @@ async fn main()->AResult<()>{ request:rbx_asset::cloud::LuauSessionRequest{ place_id:subcommand.place_id, universe_id:subcommand.universe_id, - version_id:subcommand.version_id, }, }).await, } -- 2.49.1 From 97086e351f5a9b3568097c092df8058c4b75eee6 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 20:35:31 -0700 Subject: [PATCH 25/41] rbx_asset: rename LuauSessionLatestRequest --- rbx_asset/src/cloud.rs | 4 ++-- src/main.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 5ce0297..e850017 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -409,11 +409,11 @@ impl AsSessionPath for LuauSessionResponse{ &self.path } } -pub struct LuauSessionRequest{ +pub struct LuauSessionLatestRequest{ pub universe_id:u64, pub place_id:u64, } -impl AsSessionPath for LuauSessionRequest{ +impl AsSessionPath for LuauSessionLatestRequest{ fn into_session_path(&self)->impl AsRef{ let universe_id=self.universe_id; let place_id=self.place_id; diff --git a/src/main.rs b/src/main.rs index d770983..fb77ddc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -767,7 +767,7 @@ async fn main()->AResult<()>{ Some(script)=>script, None=>std::fs::read_to_string(subcommand.script_file.unwrap())?, }, - request:rbx_asset::cloud::LuauSessionRequest{ + request:rbx_asset::cloud::LuauSessionLatestRequest{ place_id:subcommand.place_id, universe_id:subcommand.universe_id, }, @@ -1800,7 +1800,7 @@ async fn get_luau_result_exp_backoff( struct RunLuauConfig{ api_key:ApiKey, script:String, - request:rbx_asset::cloud::LuauSessionRequest, + request:rbx_asset::cloud::LuauSessionLatestRequest, } async fn run_luau(config:RunLuauConfig)->AResult<()>{ let context=CloudContext::new(config.api_key); -- 2.49.1 From e1503ba89892d451405e672514ee271433b95ef5 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 8 Aug 2025 20:35:12 -0700 Subject: [PATCH 26/41] v0.4.10-pre2 --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33f9ccb..86bfcc9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.10-pre1" +version = "0.4.10-pre2" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index dc9d74e..c433e29 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.10-pre1" +version = "0.4.10-pre2" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From b80868e7220438b13c00ac93a0f7cfd12e54314d Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Sat, 9 Aug 2025 00:06:13 -0700 Subject: [PATCH 27/41] v0.4.10 Luau Execution API --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86bfcc9..0cace09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.10-pre2" +version = "0.4.10" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index c433e29..a8e25c3 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.10-pre2" +version = "0.4.10" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 287969b7d54e024ac3514effdd4701d550d4fdbe Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Sat, 23 Aug 2025 21:34:50 -0700 Subject: [PATCH 28/41] update UserInventoryItemOwner.buildersClubMembershipType type --- rbx_asset/src/cookie.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 17ca4d2..7b1269f 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -285,7 +285,7 @@ pub struct UserInventoryPageRequest{ pub struct UserInventoryItemOwner{ pub userId:u64, pub username:String, - pub buildersClubMembershipType:u64, + pub buildersClubMembershipType:String, } #[derive(serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] -- 2.49.1 From a9a8c01cb19daa1d7690327443b227c240495b94 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 15:35:13 -0700 Subject: [PATCH 29/41] do creations pages like user --- src/main.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index fb77ddc..74566a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1154,12 +1154,11 @@ async fn download_location(api_key:ApiKey,asset_id:AssetID,version:Option)- Ok(()) } -async fn get_creations_pages(context:&CookieContext,owner:rbx_asset::cookie::Owner)->AResult>{ - let mut config=rbx_asset::cookie::CreationsPageRequest{ - owner, - cursor:None, - }; - let mut asset_list=Vec::new(); +async fn get_creations_pages( + context:&CookieContext, + asset_list:&mut Vec, + config:&mut rbx_asset::cookie::CreationsPageRequest, +)->AResult<()>{ loop{ let mut page=context.get_creations_page(&config).await?; asset_list.append(&mut page.data); @@ -1168,12 +1167,18 @@ async fn get_creations_pages(context:&CookieContext,owner:rbx_asset::cookie::Own } config.cursor=page.nextPageCursor; } - Ok(asset_list) + Ok(()) } async fn download_creations_json(cookie:Cookie,owner:rbx_asset::cookie::Owner,output_folder:PathBuf)->AResult<()>{ let context=CookieContext::new(cookie); - let item_list=get_creations_pages(&context,owner).await?; + + let mut config=rbx_asset::cookie::CreationsPageRequest{ + owner, + cursor:None, + }; + let mut asset_list=Vec::new(); + let item_list=get_creations_pages(&context,&mut asset_list,&mut config).await?; let mut path=output_folder.clone(); path.set_file_name("versions.json"); -- 2.49.1 From ddf294c6f9c868b02d41187440608d128c29862a Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 15:35:25 -0700 Subject: [PATCH 30/41] rename cursor.json to just cursor --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 74566a3..61e227f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1207,7 +1207,7 @@ async fn download_user_inventory_json(cookie:Cookie,user_id:u64,output_folder:Pa let mut versions_path=output_folder.clone(); versions_path.set_file_name("versions.json"); let mut cursor_path=output_folder.clone(); - cursor_path.set_file_name("cursor.json"); + cursor_path.set_file_name("cursor"); let context=CookieContext::new(cookie); -- 2.49.1 From afd8a74e3454a0fa3ecafd7dc34b4403c8c8826b Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 15:42:36 -0700 Subject: [PATCH 31/41] add continue from cursor option to DownloadCreationsJson --- src/main.rs | 69 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 61e227f..c1e5a78 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ -use std::{io::Read,path::PathBuf}; +use std::io::Read; +use std::path::{Path,PathBuf}; use clap::{Args,Parser,Subcommand}; use anyhow::{anyhow,Result as AResult}; use futures::StreamExt; @@ -148,6 +149,8 @@ struct DownloadCreationsJsonSubcommand{ group_id:Option, #[arg(long,group="owner",required=true)] user_id:Option, + #[arg(long)] + continue_from_cursor:Option, } /// Download the list of asset ids (not the assets themselves) in a user's inventory. The output is written to `output_folder/versions.json` #[derive(Args)] @@ -600,6 +603,7 @@ async fn main()->AResult<()>{ subcommand.group_id, )?, subcommand.output_folder.unwrap_or_else(||std::env::current_dir().unwrap()), + subcommand.continue_from_cursor.unwrap_or(false), ).await, Commands::DownloadUserInventoryJson(subcommand)=>download_user_inventory_json( cookie_from_args( @@ -1170,19 +1174,60 @@ async fn get_creations_pages( Ok(()) } -async fn download_creations_json(cookie:Cookie,owner:rbx_asset::cookie::Owner,output_folder:PathBuf)->AResult<()>{ +async fn download_creations_pages_from_checkpoint(context:&CookieContext,owner:rbx_asset::cookie::Owner,output_folder:&Path,continue_from_cursor:bool)->AResult>{ + let mut versions_path=output_folder.to_owned(); + versions_path.set_file_name("versions.json"); + let mut cursor_path=output_folder.to_owned(); + cursor_path.set_file_name("cursor"); + + let (mut asset_list,mut config)=if continue_from_cursor{ + // load state from files + let (versions,cursor)=tokio::try_join!( + tokio::fs::read(versions_path.as_path()), + tokio::fs::read_to_string(cursor_path.as_path()), + )?; + ( + serde_json::from_slice(&versions)?, + rbx_asset::cookie::CreationsPageRequest{ + owner, + cursor:Some(cursor), + } + ) + }else{ + // create new state + ( + Vec::new(), + rbx_asset::cookie::CreationsPageRequest{ + owner, + cursor:None, + } + ) + }; + + match get_creations_pages(&context,&mut asset_list,&mut config).await{ + Ok(())=>println!("Pages polling complete"), + Err(e)=>println!("Error: {e}"), + } + + let cursor_fut=async{ + if let Some(cursor)=config.cursor{ + println!("writing cursor state..."); + // there was a problem, write out cursor + tokio::fs::write(cursor_path,cursor).await?; + } + Ok(()) + }; + let versions_fut=tokio::fs::write(versions_path,serde_json::to_string(&asset_list)?); + + tokio::try_join!(versions_fut,cursor_fut)?; + + Ok(asset_list) +} + +async fn download_creations_json(cookie:Cookie,owner:rbx_asset::cookie::Owner,output_folder:PathBuf,continue_from_cursor:bool)->AResult<()>{ let context=CookieContext::new(cookie); - let mut config=rbx_asset::cookie::CreationsPageRequest{ - owner, - cursor:None, - }; - let mut asset_list=Vec::new(); - let item_list=get_creations_pages(&context,&mut asset_list,&mut config).await?; - - let mut path=output_folder.clone(); - path.set_file_name("versions.json"); - tokio::fs::write(path,serde_json::to_string(&item_list)?).await?; + download_creations_pages_from_checkpoint(&context,owner,output_folder.as_path(),continue_from_cursor).await?; Ok(()) } -- 2.49.1 From 24f50de2ae15bec0ab432a90a6e2ae8202f4ace2 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 15:47:14 -0700 Subject: [PATCH 32/41] use sort_by_key --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index c1e5a78..957deca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1311,7 +1311,7 @@ async fn get_version_history(context:&CookieContext,asset_id:AssetID)->AResultAResult<()>{ cursor=page.nextPageCursor; } - asset_list.sort_by(|a,b|a.assetVersionNumber.cmp(&b.assetVersionNumber)); + asset_list.sort_by_key(|a|a.assetVersionNumber); let mut path=config.output_folder.clone(); path.set_file_name("versions.json"); -- 2.49.1 From 7665ccc5d1ab1bb2bf4f26f3a77ab37c52cbc636 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 16:04:47 -0700 Subject: [PATCH 33/41] rbx_asset: accept reference in get_asset_versions_page --- rbx_asset/src/cookie.rs | 2 +- src/main.rs | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 7b1269f..773dd9e 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -590,7 +590,7 @@ impl Context{ ).await.map_err(GetError::Response)? .json().await.map_err(GetError::Reqwest) } - pub async fn get_asset_versions_page(&self,config:AssetVersionsPageRequest)->Result{ + pub async fn get_asset_versions_page(&self,config:&AssetVersionsPageRequest)->Result{ let mut url=reqwest::Url::parse(format!("https://develop.roblox.com/v1/assets/{}/saved-versions",config.asset_id).as_str()).map_err(PageError::ParseError)?; //url borrow scope { diff --git a/src/main.rs b/src/main.rs index 957deca..287cd6f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1301,15 +1301,18 @@ async fn download_user_inventory_json(cookie:Cookie,user_id:u64,output_folder:Pa } async fn get_version_history(context:&CookieContext,asset_id:AssetID)->AResult>{ - let mut cursor:Option=None; + let mut page_request=rbx_asset::cookie::AssetVersionsPageRequest{ + asset_id, + cursor:None, + }; let mut asset_list=Vec::new(); loop{ - let mut page=context.get_asset_versions_page(rbx_asset::cookie::AssetVersionsPageRequest{asset_id,cursor}).await?; + let mut page=context.get_asset_versions_page(&page_request).await?; asset_list.append(&mut page.data); if page.nextPageCursor.is_none(){ break; } - cursor=page.nextPageCursor; + page_request.cursor=page.nextPageCursor; } asset_list.sort_by_key(|a|a.assetVersionNumber); Ok(asset_list) @@ -1367,9 +1370,12 @@ async fn download_history(mut config:DownloadHistoryConfig)->AResult<()>{ let mut join_set=tokio::task::JoinSet::new(); //poll paged list of all asset versions - let mut cursor:Option=None; + let mut page_request=rbx_asset::cookie::AssetVersionsPageRequest{ + asset_id:config.asset_id, + cursor:None, + }; loop{ - let mut page=context.get_asset_versions_page(rbx_asset::cookie::AssetVersionsPageRequest{asset_id:config.asset_id,cursor}).await?; + let mut page=context.get_asset_versions_page(&page_request).await?; let context=&context; let output_folder=config.output_folder.clone(); let data=&page.data; @@ -1428,7 +1434,7 @@ async fn download_history(mut config:DownloadHistoryConfig)->AResult<()>{ }else{ asset_list.append(&mut page.data); } - cursor=page.nextPageCursor; + page_request.cursor=page.nextPageCursor; } asset_list.sort_by_key(|a|a.assetVersionNumber); -- 2.49.1 From 55d5f97f0b8be230c2851a99c928805916f39cbc Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 17:40:16 -0700 Subject: [PATCH 34/41] rbx_asset: update GetAssetV2Info --- rbx_asset/src/cookie.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 773dd9e..9561f31 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -141,10 +141,11 @@ impl GetAssetV2Location{ pub struct GetAssetV2Info{ pub locations:Vec, pub requestId:String, - pub IsHashDynamic:bool, - pub IsCopyrightProtected:bool, pub isArchived:bool, pub assetTypeId:u32, + pub isRecordable:Option, + pub IsHashDynamic:Option, + pub IsCopyrightProtected:Option, } pub struct GetAssetV2{ -- 2.49.1 From d9bf50e1c4d2e95df8ab883f70da6af2ab61d489 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 19:46:01 -0700 Subject: [PATCH 35/41] fix get_creations_pages --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 287cd6f..991cb30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1166,10 +1166,10 @@ async fn get_creations_pages( loop{ let mut page=context.get_creations_page(&config).await?; asset_list.append(&mut page.data); - if page.nextPageCursor.is_none(){ + config.cursor=page.nextPageCursor; + if config.cursor.is_none(){ break; } - config.cursor=page.nextPageCursor; } Ok(()) } -- 2.49.1 From c0ded31a6aa0e9e6e1af56ea837a93b3f42c4647 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 19:46:20 -0700 Subject: [PATCH 36/41] delete cursor when completed --- src/main.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main.rs b/src/main.rs index 991cb30..5b96146 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1214,6 +1214,14 @@ async fn download_creations_pages_from_checkpoint(context:&CookieContext,owner:r println!("writing cursor state..."); // there was a problem, write out cursor tokio::fs::write(cursor_path,cursor).await?; + }else{ + // no cursor + if let Err(e)=tokio::fs::remove_file(cursor_path).await{ + match e.kind(){ + std::io::ErrorKind::NotFound=>println!("Cannot delete cursor: file not found"), + _=>Err(e)?, + } + } } Ok(()) }; -- 2.49.1 From 8885eb744b46c34601d9acddfec1d5783a795506 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 19:46:41 -0700 Subject: [PATCH 37/41] propagate error in download_creations_pages_from_checkpoint --- src/main.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5b96146..4891d35 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1204,10 +1204,7 @@ async fn download_creations_pages_from_checkpoint(context:&CookieContext,owner:r ) }; - match get_creations_pages(&context,&mut asset_list,&mut config).await{ - Ok(())=>println!("Pages polling complete"), - Err(e)=>println!("Error: {e}"), - } + get_creations_pages(&context,&mut asset_list,&mut config).await?; let cursor_fut=async{ if let Some(cursor)=config.cursor{ -- 2.49.1 From fdf0c143097007f01769bc3aa3ed31264129b507 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 19:47:04 -0700 Subject: [PATCH 38/41] detect resume files correctly in download_creations_pages_from_checkpoint --- src/main.rs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4891d35..a55ee70 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1182,15 +1182,34 @@ async fn download_creations_pages_from_checkpoint(context:&CookieContext,owner:r let (mut asset_list,mut config)=if continue_from_cursor{ // load state from files - let (versions,cursor)=tokio::try_join!( + let (versions,cursor)=tokio::join!( tokio::fs::read(versions_path.as_path()), tokio::fs::read_to_string(cursor_path.as_path()), - )?; + ); + // allow versions to not exist + let (versions,cursor)=match (versions,cursor){ + // continue downloading + (Ok(versions),Ok(cursor))=>(serde_json::from_slice(&versions)?,Some(cursor)), + // already downloaded + (Ok(versions),Err(e)) if matches!(e.kind(),std::io::ErrorKind::NotFound)=>return Ok(serde_json::from_slice(&versions)?), + // not downloaded + (Err(e),result) if matches!(e.kind(),std::io::ErrorKind::NotFound)=>{ + match result{ + Ok(_)=>{}, + Err(e) if matches!(e.kind(),std::io::ErrorKind::NotFound)=>{}, + Err(e)=>Err(e)?, + } + (Vec::new(),None) + }, + // other errors + (Ok(_),Err(e))=>Err(e)?, + (Err(e),_)=>Err(e)?, + }; ( - serde_json::from_slice(&versions)?, + versions, rbx_asset::cookie::CreationsPageRequest{ owner, - cursor:Some(cursor), + cursor, } ) }else{ -- 2.49.1 From e5e75ef3cbb97bfa63b7cef3d822cf52c5f65f10 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 19:45:48 -0700 Subject: [PATCH 39/41] DownloadCreationsHistory --- src/main.rs | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a55ee70..18a2e0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use std::io::Read; use std::path::{Path,PathBuf}; use clap::{Args,Parser,Subcommand}; use anyhow::{anyhow,Result as AResult}; -use futures::StreamExt; +use futures::{StreamExt,TryStreamExt}; use rbx_asset::cloud::{ApiKey,Context as CloudContext}; use rbx_asset::cookie::{Cookie,Context as CookieContext,AssetVersion,CreationsItem}; @@ -10,6 +10,7 @@ type AssetID=u64; type AssetIDFileMap=Vec<(AssetID,PathBuf)>; const CONCURRENT_DECODE:usize=8; const CONCURRENT_REQUESTS:usize=32; +const CONCURRENT_FS:usize=64; #[derive(Parser)] #[command(author,version,about,long_about=None)] @@ -30,6 +31,7 @@ enum Commands{ DownloadVersionV2(DownloadVersionSubcommand), DownloadDecompile(DownloadDecompileSubcommand), DownloadCreationsJson(DownloadCreationsJsonSubcommand), + DownloadCreationsHistory(DownloadCreationsHistorySubcommand), DownloadUserInventoryJson(DownloadUserInventoryJsonSubcommand), CreateAsset(CreateAssetSubcommand), CreateAssetMedia(CreateAssetMediaSubcommand), @@ -605,6 +607,7 @@ async fn main()->AResult<()>{ subcommand.output_folder.unwrap_or_else(||std::env::current_dir().unwrap()), subcommand.continue_from_cursor.unwrap_or(false), ).await, + Commands::DownloadCreationsHistory(subcommand)=>subcommand.run().await, Commands::DownloadUserInventoryJson(subcommand)=>download_user_inventory_json( cookie_from_args( subcommand.cookie_literal, @@ -1324,6 +1327,148 @@ async fn download_user_inventory_json(cookie:Cookie,user_id:u64,output_folder:Pa Ok(()) } +/// Download all versions of all assets created by a group or user. The output is written to a folder structure in the output directory. +#[derive(Args)] +struct DownloadCreationsHistorySubcommand{ + #[arg(long,group="cookie",required=true)] + cookie_literal:Option, + #[arg(long,group="cookie",required=true)] + cookie_envvar:Option, + #[arg(long,group="cookie",required=true)] + cookie_file:Option, + #[arg(long,group="api_key",required=true)] + api_key_literal:Option, + #[arg(long,group="api_key",required=true)] + api_key_envvar:Option, + #[arg(long,group="api_key",required=true)] + api_key_file:Option, + #[arg(long)] + output_folder:Option, + #[arg(long,group="owner",required=true)] + group_id:Option, + #[arg(long,group="owner",required=true)] + user_id:Option, + #[arg(long)] + r#continue:Option, +} +impl DownloadCreationsHistorySubcommand{ + async fn run(self)->AResult<()>{ + download_creations_history( + cookie_from_args( + self.cookie_literal, + self.cookie_envvar, + self.cookie_file, + ).await?, + api_key_from_args( + self.api_key_literal, + self.api_key_envvar, + self.api_key_file, + ).await?, + owner_from_args( + self.user_id, + self.group_id, + )?, + self.output_folder.unwrap_or_else(||std::env::current_dir().unwrap()), + self.r#continue.unwrap_or(false), + ).await + } +} +async fn download_creations_history(cookie:Cookie,api_key:ApiKey,owner:rbx_asset::cookie::Owner,output_folder:PathBuf,r#continue:bool)->AResult<()>{ + + let cookie_context=CookieContext::new(cookie); + let cloud_context=CloudContext::new(api_key); + + // get list of all assets in inventory + let asset_list=download_creations_pages_from_checkpoint(&cookie_context,owner,output_folder.as_path(),r#continue).await?; + + // create folder directories + let asset_folders:Vec ={ + futures::stream::iter(asset_list.iter().map(|asset|async{ + // create asset folder + let mut asset_folder=output_folder.clone(); + asset_folder.push(asset.id.to_string()); + tokio::fs::create_dir_all(asset_folder.as_path()).await?; + Ok::<_,anyhow::Error>(asset_folder) + })) + .buffered(CONCURRENT_FS) + .try_collect().await? + }; + + #[expect(dead_code)] + #[derive(Debug)] + enum Error<'a>{ + NoLocations(Job<'a>), + GetVersionLocationError(rbx_asset::cloud::GetError), + GetError(rbx_asset::cloud::GetError), + Io(std::io::Error), + } + #[derive(Clone,Copy,Debug)] + struct Job<'a>{ + path:&'a PathBuf, + asset_id:u64, + asset_version:u64, + } + let mut job_list=Vec::new(); + + // create flattened futures stream to parallel download all asset versions + for (path,asset) in asset_folders.iter().zip(asset_list){ + + // save versions file + let mut versions_path=path.to_owned(); + versions_path.push("versions.json"); + + let version_history=if r#continue{ + let file=tokio::fs::read(versions_path.as_path()).await?; + serde_json::from_slice(&file)? + }else{ + println!("Downloading history for {} - {}",asset.id,asset.name); + let version_history=get_version_history(&cookie_context,asset.id).await?; + println!("Found {} versions",version_history.len()); + tokio::fs::write(versions_path,serde_json::to_string(&version_history)?).await?; + version_history + }; + + job_list.extend(version_history.into_iter().map(|asset_version| + Job{ + path, + asset_id:asset.id, + asset_version:asset_version.assetVersionNumber, + } + )); + } + + println!("Completed jobs list. Number of jobs: {}",job_list.len()); + + futures::stream::iter(job_list).map(async|job|{ + let mut dest=job.path.to_owned(); + dest.push(format!("{}_v{}.rbxl",job.asset_id,job.asset_version)); + //if the file already exists, don't try downloading it again + if tokio::fs::try_exists(dest.as_path()).await.map_err(Error::Io)?{ + return Ok(()); + } + let location=cloud_context.get_asset_version_location(rbx_asset::cloud::GetAssetVersionRequest{ + asset_id:job.asset_id, + version:job.asset_version, + }).await.map_err(Error::GetVersionLocationError)?; + let location=location.location.ok_or(Error::NoLocations(job))?; + let downloaded=cloud_context.get_asset(&location).await.map_err(Error::GetError)?; + tokio::fs::write(dest,downloaded.to_vec().map_err(Error::Io)?).await.map_err(Error::Io)?; + Ok(()) + }) + .buffer_unordered(CONCURRENT_REQUESTS) + .for_each(async|result|{ + match result{ + Ok(())=>{}, + Err(Error::NoLocations(job))=>println!("Job failed due to no locations: asset_id={} version={}",job.asset_id,job.asset_version), + Err(e)=>println!("Error: {e:?}"), + } + }).await; + + println!("All jobs complete."); + + Ok(()) +} + async fn get_version_history(context:&CookieContext,asset_id:AssetID)->AResult>{ let mut page_request=rbx_asset::cookie::AssetVersionsPageRequest{ asset_id, -- 2.49.1 From f59a2e0b6a7c8cedf3e72f1bfe096b934f30a4d5 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 20:41:29 -0700 Subject: [PATCH 40/41] rbx_asset v0.5.0 minor braking changes --- Cargo.lock | 2 +- rbx_asset/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0cace09..dc4b2a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1449,7 +1449,7 @@ dependencies = [ [[package]] name = "rbx_asset" -version = "0.4.10" +version = "0.5.0" dependencies = [ "bytes", "chrono", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index a8e25c3..db925dc 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rbx_asset" -version = "0.4.10" +version = "0.5.0" edition = "2021" publish = ["strafesnet"] repository = "https://git.itzana.me/StrafesNET/asset-tool" -- 2.49.1 From 2faddb741f0e23660d9c072c96067880fb26ba6e Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Mon, 25 Aug 2025 20:42:03 -0700 Subject: [PATCH 41/41] asset-tool v0.5.0 new commands + minor breaking changes --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dc4b2a8..3f6590c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,7 +124,7 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "asset-tool" -version = "0.4.12" +version = "0.5.0" dependencies = [ "anyhow", "clap", diff --git a/Cargo.toml b/Cargo.toml index e31f523..826c812 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ workspace = { members = ["rbx_asset", "rox_compiler"] } [package] name = "asset-tool" -version = "0.4.12" +version = "0.5.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -- 2.49.1