├── .gitignore ├── contrib ├── verify-commits │ └── trusted-keys └── scripts │ ├── check-crate.sh │ └── check-fmt.sh ├── SECURITY.md ├── README.md ├── rustfmt.toml ├── CONTRIBUTING.md ├── doc └── nostr-rest.service ├── src ├── logger.rs ├── config │ ├── model.rs │ └── mod.rs ├── main.rs ├── error.rs └── handler.rs ├── .github ├── dependabot.yml ├── ISSUE_TEMPLATE │ ├── enhancement_request.md │ └── bug_report.md ├── workflows │ └── ci.yml └── pull_request_template.md ├── justfile ├── Cargo.toml ├── LICENSE ├── config.toml └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .DS_Store 3 | .vscode/ 4 | .idea/ 5 | -------------------------------------------------------------------------------- /contrib/verify-commits/trusted-keys: -------------------------------------------------------------------------------- 1 | 86F3105ADFA8AB587268DCD78D3DCD04249619D1 -------------------------------------------------------------------------------- /contrib/scripts/check-crate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euo pipefail 4 | 5 | cargo check 6 | cargo test 7 | cargo clippy -- -D warnings -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Reporting a Vulnerability 2 | 3 | For security vulnerability reporting and our complete security policy, please see: https://github.com/rust-nostr/guidelines 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nostr Rest API 2 | 3 | ## Description 4 | 5 | A bridge for interacting with nostr relays using rest API. 6 | 7 | ## License 8 | 9 | This project is distributed under the MIT software license - see the [LICENSE](./LICENSE) file for details 10 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 4 2 | newline_style = "Auto" 3 | reorder_imports = true 4 | reorder_modules = true 5 | reorder_impl_items = false 6 | indent_style = "Block" 7 | normalize_comments = false 8 | imports_granularity = "Module" 9 | group_imports = "StdExternalCrate" -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Organization guidelines 4 | 5 | This project follows the rust-nostr organization guidelines: https://github.com/rust-nostr/guidelines 6 | 7 | ## Additional repository guidelines 8 | 9 | ### Coding Conventions 10 | 11 | Install https://github.com/casey/just and use `just precommit` 12 | to format and check the code before committing. 13 | The CI also enforces this. 14 | -------------------------------------------------------------------------------- /doc/nostr-rest.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Nostr Rest API 3 | 4 | [Service] 5 | ExecStart=/usr/local/bin/nostr-rest 6 | User= 7 | Type=simple 8 | KillMode=process 9 | Restart=always 10 | RestartSec=60 11 | Environment="RUST_BACKTRACE=1" 12 | 13 | # Hardening measures 14 | PrivateTmp=true 15 | ProtectSystem=full 16 | NoNewPrivileges=true 17 | MemoryDenyWriteExecute=true 18 | 19 | [Install] 20 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /src/logger.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use tracing::Level; 6 | 7 | use super::Config; 8 | 9 | pub fn init(config: &Config) { 10 | let log_level: Level = if cfg!(debug_assertions) && config.log_level != Level::TRACE { 11 | Level::DEBUG 12 | } else { 13 | config.log_level 14 | }; 15 | tracing_subscriber::fmt().with_max_level(log_level).init(); 16 | } 17 | -------------------------------------------------------------------------------- /contrib/scripts/check-fmt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euo pipefail 4 | 5 | version="nightly-2024-01-11" 6 | flags="" 7 | 8 | # Check if "check" is passed as an argument 9 | if [[ "$#" -gt 0 && "$1" == "check" ]]; then 10 | flags="--check" 11 | fi 12 | 13 | # Install toolchain 14 | cargo +$version --version || (rustup install $version && rustup component add rustfmt --toolchain $version) 15 | 16 | # Check workspace crates 17 | cargo +$version fmt --all -- --config format_code_in_doc_comments=true $flags 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "cargo" 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "monthly" 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement request 3 | about: Request a new feature or change to an existing feature 4 | title: '' 5 | labels: 'enhancement' 6 | assignees: '' 7 | --- 8 | 9 | **Describe the enhancement** 10 | 11 | 12 | **Use case** 13 | 14 | 15 | **Additional context** 16 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | fmt: 14 | name: Format 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v3 19 | - name: Install just 20 | run: cargo install just 21 | - name: Check 22 | run: just check-fmt 23 | 24 | check: 25 | name: Check crate 26 | runs-on: ubuntu-latest 27 | steps: 28 | - name: Checkout 29 | uses: actions/checkout@v3 30 | - name: Install just 31 | run: cargo install just 32 | - name: Check 33 | run: just check-crate -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: 'bug' 6 | assignees: '' 7 | --- 8 | 9 | **Describe the bug** 10 | 11 | 12 | **To Reproduce** 13 | 14 | 15 | **Expected behavior** 16 | 17 | 18 | **Build environment** 19 | - Tag/commit: 20 | - OS+version: 21 | - Rust/Cargo version: 22 | 23 | **Additional context** 24 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### Description 4 | 5 | 6 | 7 | ### Notes to the reviewers 8 | 9 | 11 | 12 | ### Changelog notice 13 | 14 | 15 | 16 | 17 | ### Checklists 18 | 19 | #### All Submissions: 20 | 21 | * [ ] I followed the [contribution guidelines](https://github.com/rust-nostr/nostr/blob/master/CONTRIBUTING.md) 22 | * [ ] I ran `just precommit` or `just check` before committing -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | default: build 2 | 3 | # Build (release) 4 | build: 5 | cargo build --release 6 | 7 | bench: 8 | ab -n 100000 -c 16 -k -r -t 60 http://127.0.0.1:7773/ping 9 | 10 | # Check format and crates 11 | check: check-fmt check-crate 12 | 13 | # Format the code and execute some checks 14 | precommit: fmt 15 | cargo check 16 | cargo test 17 | cargo clippy 18 | 19 | # Format the entire Rust code 20 | fmt: 21 | @bash contrib/scripts/check-fmt.sh 22 | 23 | # Check if the Rust code is formatted 24 | check-fmt: 25 | @bash contrib/scripts/check-fmt.sh check 26 | 27 | # Check crate 28 | check-crate: 29 | @bash contrib/scripts/check-crate.sh 30 | 31 | # Remove artifacts that cargo has generated 32 | clean: 33 | cargo clean 34 | 35 | # Count the lines of codes of this project 36 | loc: 37 | @echo "--- Counting lines of .rs files (LOC):" && find crates/ bindings/ -type f -name "*.rs" -not -path "*/target/*" -exec cat {} \; | wc -l 38 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "nostr-rest" 3 | version = "0.1.0" 4 | edition = "2021" 5 | description = "Nostr Rest API" 6 | authors = ["Yuki Kishimoto "] 7 | homepage = "https://github.com/rust-nostr/nostr-rest" 8 | repository = "https://github.com/rust-nostr/nostr-rest.git" 9 | license = "MIT" 10 | readme = "README.md" 11 | keywords = ["nostr", "api", "rest"] 12 | 13 | [dependencies] 14 | axum = { version = "0.8", features = ["macros"] } 15 | clap = { version = "4.5", features = ["derive"] } 16 | dirs = "6.0" 17 | nostr-sdk = { git = "https://github.com/rust-nostr/nostr", rev = "1470b8b00437e586fb86035484f942d6202db83a", default-features = false } 18 | redis = { version = "0.28", features = ["tokio-comp"] } 19 | serde = { version = "1.0", features = ["derive"] } 20 | serde_json = "1.0" 21 | tokio = { version = "1.43", features = ["net"] } 22 | toml = "0.8" 23 | tower-http = { version = "0.6", features = ["cors", "trace"] } 24 | tracing = "0.1" 25 | tracing-subscriber = { version = "0.3" } 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yuki Kishimoto 4 | Copyright (c) 2023-2025 Rust Nostr Developers 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | ## 2 | ## NDK Rest configuration file. Lines beginning with # are comments. 3 | ## 4 | 5 | # Console log level: TRACE, DEBUG, INFO, WARN, ERROR (default: INFO) 6 | # log_level = "INFO" 7 | 8 | [network] 9 | # Bind to this network address (default: "127.0.0.1:7773") 10 | # listen_addr = "127.0.0.1:7773" 11 | 12 | # Enable permissive CORS (default: false) 13 | # Permissive mode should NOT be used in production! 14 | # permissive_cors = false 15 | 16 | [limit] 17 | # Max filters that can be sent to /events endpoint (default: 10) 18 | # max_filters = 10 19 | 20 | # Max events allowed per filters (default: 100) 21 | # max_events_per_filter = 100 22 | 23 | [nostr] 24 | # Read/Write relays 25 | relays = ["wss://relay.damus.io"] 26 | 27 | # Discovery relays (used for gossip) 28 | discovery = ["wss://relay.damus.io"] 29 | 30 | # Use the gossip model (default: false) 31 | gossip = true 32 | 33 | # Event fetching timeout in secs (default: 10) 34 | fetch-timeout = 15 35 | 36 | [redis] 37 | # Enable redis (default: false) 38 | enabled = false 39 | 40 | # Redis endpoint (default: "redis://127.0.0.1") 41 | # endpoint = "redis://127.0.0.1" 42 | 43 | # Expiration in secs (default: 60) 44 | expiration = 60 45 | -------------------------------------------------------------------------------- /src/config/model.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use std::net::SocketAddr; 6 | use std::time::Duration; 7 | 8 | use nostr_sdk::{RelayUrl, Url}; 9 | use serde::Deserialize; 10 | 11 | #[derive(Debug, Clone)] 12 | pub struct Network { 13 | pub listen_addr: SocketAddr, 14 | pub permissive_cors: bool, 15 | } 16 | 17 | #[derive(Deserialize)] 18 | pub struct ConfigFileNetwork { 19 | pub listen_addr: Option, 20 | pub permissive_cors: Option, 21 | } 22 | 23 | #[derive(Debug, Clone)] 24 | pub struct Limit { 25 | pub max_filters: usize, 26 | //pub max_events_per_filter: usize, 27 | } 28 | 29 | #[derive(Deserialize)] 30 | pub struct ConfigFileLimit { 31 | pub max_filters: Option, 32 | //pub max_events_per_filter: Option, 33 | } 34 | 35 | #[derive(Debug, Clone)] 36 | pub struct Nostr { 37 | pub relays: Vec, 38 | pub discovery: Vec, 39 | pub gossip: bool, 40 | pub fetch_timeout: Duration, 41 | } 42 | 43 | #[derive(Deserialize)] 44 | pub struct ConfigFileNostr { 45 | pub relays: Vec, 46 | pub discovery: Vec, 47 | pub gossip: bool, 48 | #[serde(rename = "fetch-timeout")] 49 | pub fetch_timeout: Option, 50 | } 51 | 52 | #[derive(Debug, Clone)] 53 | pub struct Redis { 54 | pub enabled: bool, 55 | pub endpoint: Url, 56 | pub expiration: u64, 57 | } 58 | 59 | #[derive(Deserialize)] 60 | pub struct ConfigFileRedis { 61 | pub enabled: Option, 62 | pub endpoint: Option, 63 | pub expiration: Option, 64 | } 65 | 66 | #[derive(Debug, Clone)] 67 | pub struct Config { 68 | pub log_level: tracing::Level, 69 | pub network: Network, 70 | pub limit: Limit, 71 | pub nostr: Nostr, 72 | pub redis: Redis, 73 | } 74 | 75 | #[derive(Deserialize)] 76 | pub struct ConfigFile { 77 | pub log_level: Option, 78 | pub network: ConfigFileNetwork, 79 | pub limit: ConfigFileLimit, 80 | pub nostr: ConfigFileNostr, 81 | pub redis: ConfigFileRedis, 82 | } 83 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use std::time::Duration; 6 | 7 | use axum::http::Method; 8 | use axum::routing::{get, post}; 9 | use axum::Router; 10 | use nostr_sdk::{Client, Options, Result}; 11 | use redis::Client as RedisClient; 12 | use tower_http::cors::{Any, CorsLayer}; 13 | use tower_http::trace::TraceLayer; 14 | 15 | mod config; 16 | mod error; 17 | mod handler; 18 | mod logger; 19 | 20 | use self::config::Config; 21 | 22 | #[derive(Clone)] 23 | pub struct AppState { 24 | config: Config, 25 | client: Client, 26 | redis: Option, 27 | } 28 | 29 | #[tokio::main] 30 | async fn main() -> Result<()> { 31 | let config = Config::get(); 32 | 33 | #[cfg(debug_assertions)] 34 | println!("{:?}\n", config); 35 | 36 | logger::init(&config); 37 | 38 | let opts: Options = Options::new().gossip(config.nostr.gossip); 39 | let client: Client = Client::builder().opts(opts).build(); 40 | 41 | for relay in config.nostr.relays.iter() { 42 | client.add_relay(relay).await?; 43 | } 44 | 45 | for relay in config.nostr.discovery.iter() { 46 | client.add_discovery_relay(relay).await?; 47 | } 48 | 49 | client.connect().await; 50 | 51 | let redis: Option = if config.redis.enabled { 52 | Some(RedisClient::open(config.redis.endpoint.clone())?) 53 | } else { 54 | None 55 | }; 56 | 57 | let state = AppState { 58 | config: config.clone(), 59 | client, 60 | redis, 61 | }; 62 | 63 | let app = Router::new() 64 | .route("/ping", get(handler::ping)) 65 | .route("/event", post(handler::publish_event)) 66 | .route("/event/{event_id}", get(handler::get_event_by_id)) 67 | .route("/events", post(handler::get_events)) 68 | .layer(if config.network.permissive_cors { 69 | CorsLayer::permissive() 70 | } else { 71 | CorsLayer::new() 72 | .allow_methods([Method::GET, Method::POST]) 73 | .allow_origin(Any) 74 | .max_age(Duration::from_secs(3600)) 75 | }) 76 | .layer(TraceLayer::new_for_http()) 77 | .with_state(state); 78 | 79 | let listener = tokio::net::TcpListener::bind(config.network.listen_addr).await?; 80 | 81 | tracing::info!("REST API listening on {}", listener.local_addr()?); 82 | 83 | Ok(axum::serve(listener, app).await?) 84 | } 85 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use axum::extract::rejection::JsonRejection; 6 | use axum::extract::FromRequest; 7 | use axum::http::StatusCode; 8 | use axum::response::{IntoResponse, Response}; 9 | use serde_json::json; 10 | 11 | #[derive(FromRequest)] 12 | #[from_request(via(axum::Json), rejection(AppError))] 13 | pub struct AppJson(pub T); 14 | 15 | impl IntoResponse for AppJson 16 | where 17 | axum::Json: IntoResponse, 18 | { 19 | fn into_response(self) -> Response { 20 | axum::Json(self.0).into_response() 21 | } 22 | } 23 | 24 | pub enum AppError { 25 | // Too many filters were provided in the request 26 | FilterError(usize), 27 | // Too many filters were provided in the request 28 | EventIdNotFound, 29 | // The request body contained invalid JSON 30 | JsonRejection(JsonRejection), 31 | // An Nostr Client error occurred 32 | NostrClientError(nostr_sdk::client::Error), 33 | // An Nostr Event error occurred 34 | NostrEventError(nostr_sdk::event::Error), 35 | // A Redis error occurred 36 | RedisError(redis::RedisError), 37 | } 38 | 39 | impl IntoResponse for AppError { 40 | fn into_response(self) -> Response { 41 | let (status, message) = match self { 42 | AppError::FilterError(max_filters) => ( 43 | StatusCode::BAD_REQUEST, 44 | format!("Too many filters (max allowed {max_filters})"), 45 | ), 46 | AppError::EventIdNotFound => { 47 | (StatusCode::BAD_REQUEST, String::from("Event ID not found")) 48 | } 49 | AppError::JsonRejection(rejection) => (rejection.status(), rejection.body_text()), 50 | AppError::NostrClientError(err) => (StatusCode::BAD_REQUEST, err.to_string()), 51 | AppError::NostrEventError(err) => (StatusCode::BAD_REQUEST, err.to_string()), 52 | AppError::RedisError(err) => (StatusCode::BAD_REQUEST, err.to_string()), 53 | }; 54 | 55 | ( 56 | status, 57 | AppJson(json!({ 58 | "success": false, 59 | "message": message, 60 | "data": {} 61 | })), 62 | ) 63 | .into_response() 64 | } 65 | } 66 | 67 | impl From for AppError { 68 | fn from(rejection: JsonRejection) -> Self { 69 | Self::JsonRejection(rejection) 70 | } 71 | } 72 | 73 | impl From for AppError { 74 | fn from(error: nostr_sdk::client::Error) -> Self { 75 | Self::NostrClientError(error) 76 | } 77 | } 78 | 79 | impl From for AppError { 80 | fn from(error: nostr_sdk::event::Error) -> Self { 81 | Self::NostrEventError(error) 82 | } 83 | } 84 | 85 | impl From for AppError { 86 | fn from(error: redis::RedisError) -> Self { 87 | Self::RedisError(error) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/config/mod.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use std::fs; 6 | use std::net::{IpAddr, Ipv4Addr, SocketAddr}; 7 | use std::path::PathBuf; 8 | use std::str::FromStr; 9 | use std::time::Duration; 10 | 11 | use clap::Parser; 12 | use nostr_sdk::Url; 13 | use tracing::Level; 14 | 15 | pub mod model; 16 | 17 | pub use self::model::Config; 18 | use self::model::{ConfigFile, Limit, Network, Nostr, Redis}; 19 | 20 | const DEFAULT_FETCH_TIMEOUT: u64 = 10; 21 | 22 | fn default_dir() -> PathBuf { 23 | let home: PathBuf = dirs::home_dir().unwrap_or_else(|| { 24 | panic!("Unknown home directory"); 25 | }); 26 | let path = home.join(".nostr-rest"); 27 | fs::create_dir_all(&path).expect("Impossible to create default dir"); 28 | path 29 | } 30 | 31 | fn default_config_file() -> PathBuf { 32 | let mut default = default_dir().join("config"); 33 | default.set_extension("toml"); 34 | 35 | if default.exists() { 36 | default 37 | } else { 38 | let path = PathBuf::from("config.toml"); 39 | if path.exists() { 40 | path 41 | } else { 42 | panic!("Config file not found."); 43 | } 44 | } 45 | } 46 | 47 | #[derive(Parser)] 48 | #[clap(author, version, about, long_about = None)] 49 | struct Args { 50 | #[clap(short, long)] 51 | config: Option, 52 | } 53 | 54 | impl Config { 55 | pub fn get() -> Self { 56 | let args: Args = Args::parse(); 57 | 58 | let config_file_path: PathBuf = args.config.unwrap_or_else(default_config_file); 59 | let content = fs::read_to_string(config_file_path).expect("Impossible to read config file"); 60 | let config_file: ConfigFile = 61 | toml::from_str(&content).expect("Impossible to parse config file"); 62 | 63 | let log_level: Level = match config_file.log_level { 64 | Some(log_level) => Level::from_str(log_level.as_str()).unwrap_or(Level::INFO), 65 | None => Level::INFO, 66 | }; 67 | 68 | Self { 69 | log_level, 70 | network: Network { 71 | listen_addr: config_file.network.listen_addr.unwrap_or_else(|| { 72 | SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7773) 73 | }), 74 | permissive_cors: config_file.network.permissive_cors.unwrap_or(false), 75 | }, 76 | limit: Limit { 77 | max_filters: config_file.limit.max_filters.unwrap_or(10), 78 | //max_events_per_filter: config_file.limit.max_events_per_filter.unwrap_or(100), 79 | }, 80 | nostr: Nostr { 81 | relays: config_file.nostr.relays, 82 | discovery: config_file.nostr.discovery, 83 | gossip: config_file.nostr.gossip, 84 | fetch_timeout: Duration::from_secs( 85 | config_file 86 | .nostr 87 | .fetch_timeout 88 | .unwrap_or(DEFAULT_FETCH_TIMEOUT), 89 | ), 90 | }, 91 | redis: Redis { 92 | enabled: config_file.redis.enabled.unwrap_or(false), 93 | endpoint: config_file.redis.endpoint.unwrap_or_else(|| { 94 | Url::parse("redis://127.0.0.1").expect("Invalid default redis endpoint") 95 | }), 96 | expiration: config_file.redis.expiration.unwrap_or(60), 97 | }, 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/handler.rs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2023 Yuki Kishimoto 2 | // Copyright (c) 2023-2025 Rust Nostr Developers 3 | // Distributed under the MIT software license 4 | 5 | use std::hash::{DefaultHasher, Hash, Hasher}; 6 | 7 | use axum::extract::{Path, State}; 8 | use axum::response::Json; 9 | use nostr_sdk::{Event, EventId, Filter}; 10 | use redis::AsyncCommands; 11 | use serde::Deserialize; 12 | use serde_json::{json, Value}; 13 | 14 | use crate::error::{AppError, AppJson}; 15 | use crate::AppState; 16 | 17 | #[derive(Deserialize)] 18 | pub struct GetEventByIdParams { 19 | event_id: EventId, 20 | } 21 | 22 | pub async fn ping() -> Json { 23 | Json(json!({ 24 | "success": true, 25 | "message": "pong", 26 | "data": {}, 27 | })) 28 | } 29 | 30 | pub async fn publish_event( 31 | state: State, 32 | body: AppJson, 33 | ) -> Result, AppError> { 34 | let event: Event = body.0; 35 | event.verify()?; 36 | state.client.send_event(event).await?; 37 | Ok(AppJson(json!({ 38 | "success": true, 39 | "message": "Event published", 40 | "data": {}, 41 | }))) 42 | } 43 | 44 | pub async fn get_events( 45 | state: State, 46 | body: AppJson>, 47 | ) -> Result, AppError> { 48 | let filters: Vec = body.0; 49 | 50 | if filters.len() > state.config.limit.max_filters { 51 | return Err(AppError::FilterError(state.config.limit.max_filters)); 52 | } 53 | 54 | let events: Vec = get_events_by_filters(state, filters).await?; 55 | 56 | Ok(AppJson(json!({ 57 | "success": true, 58 | "message": format!("Got {} events", events.len()), 59 | "data": events, 60 | }))) 61 | } 62 | 63 | pub async fn get_event_by_id( 64 | state: State, 65 | path: Path, 66 | ) -> Result, AppError> { 67 | let event_id: EventId = path.event_id; 68 | let filter: Filter = Filter::new().id(event_id); 69 | let filters: Vec = vec![filter]; 70 | let events: Vec = get_events_by_filters(state, filters).await?; 71 | let event: &Event = events.first().ok_or(AppError::EventIdNotFound)?; 72 | Ok(AppJson(json!({ 73 | "success": true, 74 | "message": "Got 1 events", 75 | "data": event, 76 | }))) 77 | } 78 | 79 | async fn get_events_by_filters( 80 | state: State, 81 | filters: Vec, 82 | ) -> Result, AppError> { 83 | if let Some(redis) = &state.redis { 84 | let mut connection = redis.get_multiplexed_async_connection().await?; 85 | 86 | // Hash filters 87 | let hash: u64 = make_hash(&filters); 88 | 89 | // Try to get cached result 90 | match connection.get(hash).await { 91 | Ok(cached) => { 92 | let bytes: Vec = cached; 93 | let events: Vec = serde_json::from_slice(&bytes).unwrap(); // TODO: remove unwrap 94 | Ok(events) 95 | } 96 | Err(..) => { 97 | let events = state 98 | .client 99 | .fetch_events(filters, state.config.nostr.fetch_timeout) 100 | .await?; 101 | let events: Vec = events.to_vec(); 102 | let encoded: Vec = serde_json::to_vec(&events).unwrap(); 103 | let _: () = connection 104 | .set_ex(hash, encoded, state.config.redis.expiration) 105 | .await?; 106 | Ok(events) 107 | } 108 | } 109 | } else { 110 | let events = state 111 | .client 112 | .fetch_events(filters, state.config.nostr.fetch_timeout) 113 | .await?; 114 | Ok(events.to_vec()) 115 | } 116 | } 117 | 118 | fn make_hash(t: &T) -> u64 { 119 | let mut s: DefaultHasher = DefaultHasher::new(); 120 | t.hash(&mut s); 121 | s.finish() 122 | } 123 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aead" 22 | version = "0.5.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" 25 | dependencies = [ 26 | "crypto-common", 27 | "generic-array", 28 | ] 29 | 30 | [[package]] 31 | name = "anstream" 32 | version = "0.6.18" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 35 | dependencies = [ 36 | "anstyle", 37 | "anstyle-parse", 38 | "anstyle-query", 39 | "anstyle-wincon", 40 | "colorchoice", 41 | "is_terminal_polyfill", 42 | "utf8parse", 43 | ] 44 | 45 | [[package]] 46 | name = "anstyle" 47 | version = "1.0.10" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 50 | 51 | [[package]] 52 | name = "anstyle-parse" 53 | version = "0.2.6" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 56 | dependencies = [ 57 | "utf8parse", 58 | ] 59 | 60 | [[package]] 61 | name = "anstyle-query" 62 | version = "1.1.2" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 65 | dependencies = [ 66 | "windows-sys 0.59.0", 67 | ] 68 | 69 | [[package]] 70 | name = "anstyle-wincon" 71 | version = "3.0.7" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 74 | dependencies = [ 75 | "anstyle", 76 | "once_cell", 77 | "windows-sys 0.59.0", 78 | ] 79 | 80 | [[package]] 81 | name = "arc-swap" 82 | version = "1.7.1" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 85 | 86 | [[package]] 87 | name = "arrayvec" 88 | version = "0.7.6" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 91 | 92 | [[package]] 93 | name = "async-utility" 94 | version = "0.3.1" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "a34a3b57207a7a1007832416c3e4862378c8451b4e8e093e436f48c2d3d2c151" 97 | dependencies = [ 98 | "futures-util", 99 | "gloo-timers", 100 | "tokio", 101 | "wasm-bindgen-futures", 102 | ] 103 | 104 | [[package]] 105 | name = "async-wsocket" 106 | version = "0.12.0" 107 | source = "git+https://github.com/yukibtc/async-wsocket?rev=5fba7927576064ac0698a4ee3df0d26e5cf726dd#5fba7927576064ac0698a4ee3df0d26e5cf726dd" 108 | dependencies = [ 109 | "async-utility", 110 | "futures", 111 | "futures-util", 112 | "js-sys", 113 | "tokio", 114 | "tokio-rustls", 115 | "tokio-socks", 116 | "tokio-tungstenite", 117 | "url", 118 | "wasm-bindgen", 119 | "web-sys", 120 | ] 121 | 122 | [[package]] 123 | name = "atomic-destructor" 124 | version = "0.3.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "ef49f5882e4b6afaac09ad239a4f8c70a24b8f2b0897edb1f706008efd109cf4" 127 | 128 | [[package]] 129 | name = "autocfg" 130 | version = "1.4.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 133 | 134 | [[package]] 135 | name = "axum" 136 | version = "0.8.1" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" 139 | dependencies = [ 140 | "axum-core", 141 | "axum-macros", 142 | "bytes", 143 | "form_urlencoded", 144 | "futures-util", 145 | "http", 146 | "http-body", 147 | "http-body-util", 148 | "hyper", 149 | "hyper-util", 150 | "itoa", 151 | "matchit", 152 | "memchr", 153 | "mime", 154 | "percent-encoding", 155 | "pin-project-lite", 156 | "rustversion", 157 | "serde", 158 | "serde_json", 159 | "serde_path_to_error", 160 | "serde_urlencoded", 161 | "sync_wrapper", 162 | "tokio", 163 | "tower", 164 | "tower-layer", 165 | "tower-service", 166 | "tracing", 167 | ] 168 | 169 | [[package]] 170 | name = "axum-core" 171 | version = "0.5.0" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" 174 | dependencies = [ 175 | "bytes", 176 | "futures-util", 177 | "http", 178 | "http-body", 179 | "http-body-util", 180 | "mime", 181 | "pin-project-lite", 182 | "rustversion", 183 | "sync_wrapper", 184 | "tower-layer", 185 | "tower-service", 186 | "tracing", 187 | ] 188 | 189 | [[package]] 190 | name = "axum-macros" 191 | version = "0.5.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" 194 | dependencies = [ 195 | "proc-macro2", 196 | "quote", 197 | "syn", 198 | ] 199 | 200 | [[package]] 201 | name = "backtrace" 202 | version = "0.3.74" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 205 | dependencies = [ 206 | "addr2line", 207 | "cfg-if", 208 | "libc", 209 | "miniz_oxide", 210 | "object", 211 | "rustc-demangle", 212 | "windows-targets", 213 | ] 214 | 215 | [[package]] 216 | name = "base64" 217 | version = "0.22.1" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 220 | 221 | [[package]] 222 | name = "base64ct" 223 | version = "1.6.0" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 226 | 227 | [[package]] 228 | name = "bech32" 229 | version = "0.11.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" 232 | 233 | [[package]] 234 | name = "bip39" 235 | version = "2.1.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" 238 | dependencies = [ 239 | "bitcoin_hashes 0.13.0", 240 | "serde", 241 | "unicode-normalization", 242 | ] 243 | 244 | [[package]] 245 | name = "bitcoin-internals" 246 | version = "0.2.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" 249 | 250 | [[package]] 251 | name = "bitcoin-io" 252 | version = "0.1.3" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" 255 | 256 | [[package]] 257 | name = "bitcoin_hashes" 258 | version = "0.13.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" 261 | dependencies = [ 262 | "bitcoin-internals", 263 | "hex-conservative 0.1.2", 264 | ] 265 | 266 | [[package]] 267 | name = "bitcoin_hashes" 268 | version = "0.14.0" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" 271 | dependencies = [ 272 | "bitcoin-io", 273 | "hex-conservative 0.2.1", 274 | "serde", 275 | ] 276 | 277 | [[package]] 278 | name = "bitflags" 279 | version = "2.8.0" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 282 | 283 | [[package]] 284 | name = "block-buffer" 285 | version = "0.10.4" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 288 | dependencies = [ 289 | "generic-array", 290 | ] 291 | 292 | [[package]] 293 | name = "block-padding" 294 | version = "0.3.3" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" 297 | dependencies = [ 298 | "generic-array", 299 | ] 300 | 301 | [[package]] 302 | name = "bumpalo" 303 | version = "3.16.0" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 306 | 307 | [[package]] 308 | name = "byteorder" 309 | version = "1.5.0" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 312 | 313 | [[package]] 314 | name = "bytes" 315 | version = "1.9.0" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 318 | 319 | [[package]] 320 | name = "cbc" 321 | version = "0.1.2" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 324 | dependencies = [ 325 | "cipher", 326 | ] 327 | 328 | [[package]] 329 | name = "cc" 330 | version = "1.2.10" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 333 | dependencies = [ 334 | "shlex", 335 | ] 336 | 337 | [[package]] 338 | name = "cfg-if" 339 | version = "1.0.0" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 342 | 343 | [[package]] 344 | name = "chacha20" 345 | version = "0.9.1" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 348 | dependencies = [ 349 | "cfg-if", 350 | "cipher", 351 | "cpufeatures", 352 | ] 353 | 354 | [[package]] 355 | name = "chacha20poly1305" 356 | version = "0.10.1" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" 359 | dependencies = [ 360 | "aead", 361 | "chacha20", 362 | "cipher", 363 | "poly1305", 364 | "zeroize", 365 | ] 366 | 367 | [[package]] 368 | name = "cipher" 369 | version = "0.4.4" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 372 | dependencies = [ 373 | "crypto-common", 374 | "inout", 375 | "zeroize", 376 | ] 377 | 378 | [[package]] 379 | name = "clap" 380 | version = "4.5.27" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" 383 | dependencies = [ 384 | "clap_builder", 385 | "clap_derive", 386 | ] 387 | 388 | [[package]] 389 | name = "clap_builder" 390 | version = "4.5.27" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 393 | dependencies = [ 394 | "anstream", 395 | "anstyle", 396 | "clap_lex", 397 | "strsim", 398 | ] 399 | 400 | [[package]] 401 | name = "clap_derive" 402 | version = "4.5.24" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" 405 | dependencies = [ 406 | "heck", 407 | "proc-macro2", 408 | "quote", 409 | "syn", 410 | ] 411 | 412 | [[package]] 413 | name = "clap_lex" 414 | version = "0.7.4" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 417 | 418 | [[package]] 419 | name = "colorchoice" 420 | version = "1.0.3" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 423 | 424 | [[package]] 425 | name = "combine" 426 | version = "4.6.7" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 429 | dependencies = [ 430 | "bytes", 431 | "futures-core", 432 | "memchr", 433 | "pin-project-lite", 434 | "tokio", 435 | "tokio-util", 436 | ] 437 | 438 | [[package]] 439 | name = "cpufeatures" 440 | version = "0.2.17" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 443 | dependencies = [ 444 | "libc", 445 | ] 446 | 447 | [[package]] 448 | name = "crypto-common" 449 | version = "0.1.6" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 452 | dependencies = [ 453 | "generic-array", 454 | "rand_core", 455 | "typenum", 456 | ] 457 | 458 | [[package]] 459 | name = "data-encoding" 460 | version = "2.7.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" 463 | 464 | [[package]] 465 | name = "digest" 466 | version = "0.10.7" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 469 | dependencies = [ 470 | "block-buffer", 471 | "crypto-common", 472 | "subtle", 473 | ] 474 | 475 | [[package]] 476 | name = "dirs" 477 | version = "6.0.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" 480 | dependencies = [ 481 | "dirs-sys", 482 | ] 483 | 484 | [[package]] 485 | name = "dirs-sys" 486 | version = "0.5.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" 489 | dependencies = [ 490 | "libc", 491 | "option-ext", 492 | "redox_users", 493 | "windows-sys 0.59.0", 494 | ] 495 | 496 | [[package]] 497 | name = "displaydoc" 498 | version = "0.2.5" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 501 | dependencies = [ 502 | "proc-macro2", 503 | "quote", 504 | "syn", 505 | ] 506 | 507 | [[package]] 508 | name = "either" 509 | version = "1.13.0" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 512 | 513 | [[package]] 514 | name = "equivalent" 515 | version = "1.0.1" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 518 | 519 | [[package]] 520 | name = "fnv" 521 | version = "1.0.7" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 524 | 525 | [[package]] 526 | name = "form_urlencoded" 527 | version = "1.2.1" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 530 | dependencies = [ 531 | "percent-encoding", 532 | ] 533 | 534 | [[package]] 535 | name = "futures" 536 | version = "0.3.31" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 539 | dependencies = [ 540 | "futures-channel", 541 | "futures-core", 542 | "futures-io", 543 | "futures-sink", 544 | "futures-task", 545 | "futures-util", 546 | ] 547 | 548 | [[package]] 549 | name = "futures-channel" 550 | version = "0.3.31" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 553 | dependencies = [ 554 | "futures-core", 555 | "futures-sink", 556 | ] 557 | 558 | [[package]] 559 | name = "futures-core" 560 | version = "0.3.31" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 563 | 564 | [[package]] 565 | name = "futures-io" 566 | version = "0.3.31" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 569 | 570 | [[package]] 571 | name = "futures-sink" 572 | version = "0.3.31" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 575 | 576 | [[package]] 577 | name = "futures-task" 578 | version = "0.3.31" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 581 | 582 | [[package]] 583 | name = "futures-util" 584 | version = "0.3.31" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 587 | dependencies = [ 588 | "futures-channel", 589 | "futures-core", 590 | "futures-io", 591 | "futures-sink", 592 | "futures-task", 593 | "memchr", 594 | "pin-project-lite", 595 | "pin-utils", 596 | "slab", 597 | ] 598 | 599 | [[package]] 600 | name = "generic-array" 601 | version = "0.14.7" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 604 | dependencies = [ 605 | "typenum", 606 | "version_check", 607 | ] 608 | 609 | [[package]] 610 | name = "getrandom" 611 | version = "0.2.15" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 614 | dependencies = [ 615 | "cfg-if", 616 | "js-sys", 617 | "libc", 618 | "wasi", 619 | "wasm-bindgen", 620 | ] 621 | 622 | [[package]] 623 | name = "gimli" 624 | version = "0.31.1" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 627 | 628 | [[package]] 629 | name = "gloo-timers" 630 | version = "0.3.0" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" 633 | dependencies = [ 634 | "futures-channel", 635 | "futures-core", 636 | "js-sys", 637 | "wasm-bindgen", 638 | ] 639 | 640 | [[package]] 641 | name = "hashbrown" 642 | version = "0.15.2" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 645 | 646 | [[package]] 647 | name = "heck" 648 | version = "0.5.0" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 651 | 652 | [[package]] 653 | name = "hex-conservative" 654 | version = "0.1.2" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" 657 | 658 | [[package]] 659 | name = "hex-conservative" 660 | version = "0.2.1" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" 663 | dependencies = [ 664 | "arrayvec", 665 | ] 666 | 667 | [[package]] 668 | name = "hmac" 669 | version = "0.12.1" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 672 | dependencies = [ 673 | "digest", 674 | ] 675 | 676 | [[package]] 677 | name = "http" 678 | version = "1.2.0" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 681 | dependencies = [ 682 | "bytes", 683 | "fnv", 684 | "itoa", 685 | ] 686 | 687 | [[package]] 688 | name = "http-body" 689 | version = "1.0.1" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 692 | dependencies = [ 693 | "bytes", 694 | "http", 695 | ] 696 | 697 | [[package]] 698 | name = "http-body-util" 699 | version = "0.1.2" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 702 | dependencies = [ 703 | "bytes", 704 | "futures-util", 705 | "http", 706 | "http-body", 707 | "pin-project-lite", 708 | ] 709 | 710 | [[package]] 711 | name = "httparse" 712 | version = "1.9.5" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" 715 | 716 | [[package]] 717 | name = "httpdate" 718 | version = "1.0.3" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 721 | 722 | [[package]] 723 | name = "hyper" 724 | version = "1.5.2" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" 727 | dependencies = [ 728 | "bytes", 729 | "futures-channel", 730 | "futures-util", 731 | "http", 732 | "http-body", 733 | "httparse", 734 | "httpdate", 735 | "itoa", 736 | "pin-project-lite", 737 | "smallvec", 738 | "tokio", 739 | ] 740 | 741 | [[package]] 742 | name = "hyper-util" 743 | version = "0.1.10" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 746 | dependencies = [ 747 | "bytes", 748 | "futures-util", 749 | "http", 750 | "http-body", 751 | "hyper", 752 | "pin-project-lite", 753 | "tokio", 754 | "tower-service", 755 | ] 756 | 757 | [[package]] 758 | name = "icu_collections" 759 | version = "1.5.0" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 762 | dependencies = [ 763 | "displaydoc", 764 | "yoke", 765 | "zerofrom", 766 | "zerovec", 767 | ] 768 | 769 | [[package]] 770 | name = "icu_locid" 771 | version = "1.5.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 774 | dependencies = [ 775 | "displaydoc", 776 | "litemap", 777 | "tinystr", 778 | "writeable", 779 | "zerovec", 780 | ] 781 | 782 | [[package]] 783 | name = "icu_locid_transform" 784 | version = "1.5.0" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 787 | dependencies = [ 788 | "displaydoc", 789 | "icu_locid", 790 | "icu_locid_transform_data", 791 | "icu_provider", 792 | "tinystr", 793 | "zerovec", 794 | ] 795 | 796 | [[package]] 797 | name = "icu_locid_transform_data" 798 | version = "1.5.0" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 801 | 802 | [[package]] 803 | name = "icu_normalizer" 804 | version = "1.5.0" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 807 | dependencies = [ 808 | "displaydoc", 809 | "icu_collections", 810 | "icu_normalizer_data", 811 | "icu_properties", 812 | "icu_provider", 813 | "smallvec", 814 | "utf16_iter", 815 | "utf8_iter", 816 | "write16", 817 | "zerovec", 818 | ] 819 | 820 | [[package]] 821 | name = "icu_normalizer_data" 822 | version = "1.5.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 825 | 826 | [[package]] 827 | name = "icu_properties" 828 | version = "1.5.1" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 831 | dependencies = [ 832 | "displaydoc", 833 | "icu_collections", 834 | "icu_locid_transform", 835 | "icu_properties_data", 836 | "icu_provider", 837 | "tinystr", 838 | "zerovec", 839 | ] 840 | 841 | [[package]] 842 | name = "icu_properties_data" 843 | version = "1.5.0" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 846 | 847 | [[package]] 848 | name = "icu_provider" 849 | version = "1.5.0" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 852 | dependencies = [ 853 | "displaydoc", 854 | "icu_locid", 855 | "icu_provider_macros", 856 | "stable_deref_trait", 857 | "tinystr", 858 | "writeable", 859 | "yoke", 860 | "zerofrom", 861 | "zerovec", 862 | ] 863 | 864 | [[package]] 865 | name = "icu_provider_macros" 866 | version = "1.5.0" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 869 | dependencies = [ 870 | "proc-macro2", 871 | "quote", 872 | "syn", 873 | ] 874 | 875 | [[package]] 876 | name = "idna" 877 | version = "1.0.3" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 880 | dependencies = [ 881 | "idna_adapter", 882 | "smallvec", 883 | "utf8_iter", 884 | ] 885 | 886 | [[package]] 887 | name = "idna_adapter" 888 | version = "1.2.0" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 891 | dependencies = [ 892 | "icu_normalizer", 893 | "icu_properties", 894 | ] 895 | 896 | [[package]] 897 | name = "indexmap" 898 | version = "2.7.1" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 901 | dependencies = [ 902 | "equivalent", 903 | "hashbrown", 904 | ] 905 | 906 | [[package]] 907 | name = "inout" 908 | version = "0.1.3" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 911 | dependencies = [ 912 | "block-padding", 913 | "generic-array", 914 | ] 915 | 916 | [[package]] 917 | name = "instant" 918 | version = "0.1.13" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 921 | dependencies = [ 922 | "cfg-if", 923 | "js-sys", 924 | "wasm-bindgen", 925 | "web-sys", 926 | ] 927 | 928 | [[package]] 929 | name = "is_terminal_polyfill" 930 | version = "1.70.1" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 933 | 934 | [[package]] 935 | name = "itoa" 936 | version = "1.0.14" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 939 | 940 | [[package]] 941 | name = "js-sys" 942 | version = "0.3.77" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 945 | dependencies = [ 946 | "once_cell", 947 | "wasm-bindgen", 948 | ] 949 | 950 | [[package]] 951 | name = "lazy_static" 952 | version = "1.5.0" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 955 | 956 | [[package]] 957 | name = "libc" 958 | version = "0.2.169" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 961 | 962 | [[package]] 963 | name = "libredox" 964 | version = "0.1.3" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 967 | dependencies = [ 968 | "bitflags", 969 | "libc", 970 | ] 971 | 972 | [[package]] 973 | name = "litemap" 974 | version = "0.7.4" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 977 | 978 | [[package]] 979 | name = "log" 980 | version = "0.4.25" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 983 | 984 | [[package]] 985 | name = "matchit" 986 | version = "0.8.4" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 989 | 990 | [[package]] 991 | name = "memchr" 992 | version = "2.7.4" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 995 | 996 | [[package]] 997 | name = "mime" 998 | version = "0.3.17" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1001 | 1002 | [[package]] 1003 | name = "miniz_oxide" 1004 | version = "0.8.3" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 1007 | dependencies = [ 1008 | "adler2", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "mio" 1013 | version = "1.0.3" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1016 | dependencies = [ 1017 | "libc", 1018 | "wasi", 1019 | "windows-sys 0.52.0", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "negentropy" 1024 | version = "0.3.1" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" 1027 | 1028 | [[package]] 1029 | name = "negentropy" 1030 | version = "0.4.3" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "43a88da9dd148bbcdce323dd6ac47d369b4769d4a3b78c6c52389b9269f77932" 1033 | 1034 | [[package]] 1035 | name = "nostr" 1036 | version = "0.38.0" 1037 | source = "git+https://github.com/rust-nostr/nostr?rev=1470b8b00437e586fb86035484f942d6202db83a#1470b8b00437e586fb86035484f942d6202db83a" 1038 | dependencies = [ 1039 | "base64", 1040 | "bech32", 1041 | "bip39", 1042 | "bitcoin_hashes 0.14.0", 1043 | "cbc", 1044 | "chacha20", 1045 | "chacha20poly1305", 1046 | "getrandom", 1047 | "instant", 1048 | "scrypt", 1049 | "secp256k1", 1050 | "serde", 1051 | "serde_json", 1052 | "unicode-normalization", 1053 | "url", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "nostr-database" 1058 | version = "0.38.0" 1059 | source = "git+https://github.com/rust-nostr/nostr?rev=1470b8b00437e586fb86035484f942d6202db83a#1470b8b00437e586fb86035484f942d6202db83a" 1060 | dependencies = [ 1061 | "nostr", 1062 | "tokio", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "nostr-relay-pool" 1067 | version = "0.38.0" 1068 | source = "git+https://github.com/rust-nostr/nostr?rev=1470b8b00437e586fb86035484f942d6202db83a#1470b8b00437e586fb86035484f942d6202db83a" 1069 | dependencies = [ 1070 | "async-utility", 1071 | "async-wsocket", 1072 | "atomic-destructor", 1073 | "negentropy 0.3.1", 1074 | "negentropy 0.4.3", 1075 | "nostr", 1076 | "nostr-database", 1077 | "tokio", 1078 | "tracing", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "nostr-rest" 1083 | version = "0.1.0" 1084 | dependencies = [ 1085 | "axum", 1086 | "clap", 1087 | "dirs", 1088 | "nostr-sdk", 1089 | "redis", 1090 | "serde", 1091 | "serde_json", 1092 | "tokio", 1093 | "toml", 1094 | "tower-http", 1095 | "tracing", 1096 | "tracing-subscriber", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "nostr-sdk" 1101 | version = "0.38.0" 1102 | source = "git+https://github.com/rust-nostr/nostr?rev=1470b8b00437e586fb86035484f942d6202db83a#1470b8b00437e586fb86035484f942d6202db83a" 1103 | dependencies = [ 1104 | "async-utility", 1105 | "nostr", 1106 | "nostr-database", 1107 | "nostr-relay-pool", 1108 | "tokio", 1109 | "tracing", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "nu-ansi-term" 1114 | version = "0.46.0" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1117 | dependencies = [ 1118 | "overload", 1119 | "winapi", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "num-bigint" 1124 | version = "0.4.6" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1127 | dependencies = [ 1128 | "num-integer", 1129 | "num-traits", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "num-integer" 1134 | version = "0.1.46" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1137 | dependencies = [ 1138 | "num-traits", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "num-traits" 1143 | version = "0.2.19" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1146 | dependencies = [ 1147 | "autocfg", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "object" 1152 | version = "0.36.7" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1155 | dependencies = [ 1156 | "memchr", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "once_cell" 1161 | version = "1.20.2" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1164 | 1165 | [[package]] 1166 | name = "opaque-debug" 1167 | version = "0.3.1" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 1170 | 1171 | [[package]] 1172 | name = "option-ext" 1173 | version = "0.2.0" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1176 | 1177 | [[package]] 1178 | name = "overload" 1179 | version = "0.1.1" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1182 | 1183 | [[package]] 1184 | name = "password-hash" 1185 | version = "0.5.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" 1188 | dependencies = [ 1189 | "base64ct", 1190 | "rand_core", 1191 | "subtle", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "pbkdf2" 1196 | version = "0.12.2" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 1199 | dependencies = [ 1200 | "digest", 1201 | "hmac", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "percent-encoding" 1206 | version = "2.3.1" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1209 | 1210 | [[package]] 1211 | name = "pin-project-lite" 1212 | version = "0.2.16" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1215 | 1216 | [[package]] 1217 | name = "pin-utils" 1218 | version = "0.1.0" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1221 | 1222 | [[package]] 1223 | name = "poly1305" 1224 | version = "0.8.0" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 1227 | dependencies = [ 1228 | "cpufeatures", 1229 | "opaque-debug", 1230 | "universal-hash", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "ppv-lite86" 1235 | version = "0.2.20" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1238 | dependencies = [ 1239 | "zerocopy", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "proc-macro2" 1244 | version = "1.0.93" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1247 | dependencies = [ 1248 | "unicode-ident", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "quote" 1253 | version = "1.0.38" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1256 | dependencies = [ 1257 | "proc-macro2", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "rand" 1262 | version = "0.8.5" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1265 | dependencies = [ 1266 | "libc", 1267 | "rand_chacha", 1268 | "rand_core", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "rand_chacha" 1273 | version = "0.3.1" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1276 | dependencies = [ 1277 | "ppv-lite86", 1278 | "rand_core", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "rand_core" 1283 | version = "0.6.4" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1286 | dependencies = [ 1287 | "getrandom", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "redis" 1292 | version = "0.28.2" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "e37ec3fd44bea2ec947ba6cc7634d7999a6590aca7c35827c250bc0de502bda6" 1295 | dependencies = [ 1296 | "arc-swap", 1297 | "bytes", 1298 | "combine", 1299 | "futures-util", 1300 | "itoa", 1301 | "num-bigint", 1302 | "percent-encoding", 1303 | "pin-project-lite", 1304 | "ryu", 1305 | "sha1_smol", 1306 | "socket2", 1307 | "tokio", 1308 | "tokio-util", 1309 | "url", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "redox_users" 1314 | version = "0.5.0" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 1317 | dependencies = [ 1318 | "getrandom", 1319 | "libredox", 1320 | "thiserror 2.0.11", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "ring" 1325 | version = "0.17.8" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1328 | dependencies = [ 1329 | "cc", 1330 | "cfg-if", 1331 | "getrandom", 1332 | "libc", 1333 | "spin", 1334 | "untrusted", 1335 | "windows-sys 0.52.0", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "rustc-demangle" 1340 | version = "0.1.24" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1343 | 1344 | [[package]] 1345 | name = "rustls" 1346 | version = "0.23.21" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" 1349 | dependencies = [ 1350 | "once_cell", 1351 | "ring", 1352 | "rustls-pki-types", 1353 | "rustls-webpki", 1354 | "subtle", 1355 | "zeroize", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "rustls-pki-types" 1360 | version = "1.10.1" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" 1363 | 1364 | [[package]] 1365 | name = "rustls-webpki" 1366 | version = "0.102.8" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1369 | dependencies = [ 1370 | "ring", 1371 | "rustls-pki-types", 1372 | "untrusted", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "rustversion" 1377 | version = "1.0.19" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1380 | 1381 | [[package]] 1382 | name = "ryu" 1383 | version = "1.0.18" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1386 | 1387 | [[package]] 1388 | name = "salsa20" 1389 | version = "0.10.2" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" 1392 | dependencies = [ 1393 | "cipher", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "scrypt" 1398 | version = "0.11.0" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" 1401 | dependencies = [ 1402 | "password-hash", 1403 | "pbkdf2", 1404 | "salsa20", 1405 | "sha2", 1406 | ] 1407 | 1408 | [[package]] 1409 | name = "secp256k1" 1410 | version = "0.29.1" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" 1413 | dependencies = [ 1414 | "rand", 1415 | "secp256k1-sys", 1416 | "serde", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "secp256k1-sys" 1421 | version = "0.10.1" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" 1424 | dependencies = [ 1425 | "cc", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "serde" 1430 | version = "1.0.217" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1433 | dependencies = [ 1434 | "serde_derive", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "serde_derive" 1439 | version = "1.0.217" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1442 | dependencies = [ 1443 | "proc-macro2", 1444 | "quote", 1445 | "syn", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "serde_json" 1450 | version = "1.0.137" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" 1453 | dependencies = [ 1454 | "itoa", 1455 | "memchr", 1456 | "ryu", 1457 | "serde", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "serde_path_to_error" 1462 | version = "0.1.16" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 1465 | dependencies = [ 1466 | "itoa", 1467 | "serde", 1468 | ] 1469 | 1470 | [[package]] 1471 | name = "serde_spanned" 1472 | version = "0.6.8" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1475 | dependencies = [ 1476 | "serde", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "serde_urlencoded" 1481 | version = "0.7.1" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1484 | dependencies = [ 1485 | "form_urlencoded", 1486 | "itoa", 1487 | "ryu", 1488 | "serde", 1489 | ] 1490 | 1491 | [[package]] 1492 | name = "sha1" 1493 | version = "0.10.6" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1496 | dependencies = [ 1497 | "cfg-if", 1498 | "cpufeatures", 1499 | "digest", 1500 | ] 1501 | 1502 | [[package]] 1503 | name = "sha1_smol" 1504 | version = "1.0.1" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 1507 | 1508 | [[package]] 1509 | name = "sha2" 1510 | version = "0.10.8" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1513 | dependencies = [ 1514 | "cfg-if", 1515 | "cpufeatures", 1516 | "digest", 1517 | ] 1518 | 1519 | [[package]] 1520 | name = "sharded-slab" 1521 | version = "0.1.7" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1524 | dependencies = [ 1525 | "lazy_static", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "shlex" 1530 | version = "1.3.0" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1533 | 1534 | [[package]] 1535 | name = "slab" 1536 | version = "0.4.9" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1539 | dependencies = [ 1540 | "autocfg", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "smallvec" 1545 | version = "1.13.2" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1548 | 1549 | [[package]] 1550 | name = "socket2" 1551 | version = "0.5.8" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1554 | dependencies = [ 1555 | "libc", 1556 | "windows-sys 0.52.0", 1557 | ] 1558 | 1559 | [[package]] 1560 | name = "spin" 1561 | version = "0.9.8" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1564 | 1565 | [[package]] 1566 | name = "stable_deref_trait" 1567 | version = "1.2.0" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1570 | 1571 | [[package]] 1572 | name = "strsim" 1573 | version = "0.11.1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1576 | 1577 | [[package]] 1578 | name = "subtle" 1579 | version = "2.6.1" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1582 | 1583 | [[package]] 1584 | name = "syn" 1585 | version = "2.0.96" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 1588 | dependencies = [ 1589 | "proc-macro2", 1590 | "quote", 1591 | "unicode-ident", 1592 | ] 1593 | 1594 | [[package]] 1595 | name = "sync_wrapper" 1596 | version = "1.0.2" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1599 | 1600 | [[package]] 1601 | name = "synstructure" 1602 | version = "0.13.1" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1605 | dependencies = [ 1606 | "proc-macro2", 1607 | "quote", 1608 | "syn", 1609 | ] 1610 | 1611 | [[package]] 1612 | name = "thiserror" 1613 | version = "1.0.69" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1616 | dependencies = [ 1617 | "thiserror-impl 1.0.69", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "thiserror" 1622 | version = "2.0.11" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1625 | dependencies = [ 1626 | "thiserror-impl 2.0.11", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "thiserror-impl" 1631 | version = "1.0.69" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1634 | dependencies = [ 1635 | "proc-macro2", 1636 | "quote", 1637 | "syn", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "thiserror-impl" 1642 | version = "2.0.11" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1645 | dependencies = [ 1646 | "proc-macro2", 1647 | "quote", 1648 | "syn", 1649 | ] 1650 | 1651 | [[package]] 1652 | name = "thread_local" 1653 | version = "1.1.8" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1656 | dependencies = [ 1657 | "cfg-if", 1658 | "once_cell", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "tinystr" 1663 | version = "0.7.6" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1666 | dependencies = [ 1667 | "displaydoc", 1668 | "zerovec", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "tinyvec" 1673 | version = "1.8.1" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 1676 | dependencies = [ 1677 | "tinyvec_macros", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "tinyvec_macros" 1682 | version = "0.1.1" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1685 | 1686 | [[package]] 1687 | name = "tokio" 1688 | version = "1.43.0" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 1691 | dependencies = [ 1692 | "backtrace", 1693 | "bytes", 1694 | "libc", 1695 | "mio", 1696 | "pin-project-lite", 1697 | "socket2", 1698 | "tokio-macros", 1699 | "windows-sys 0.52.0", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "tokio-macros" 1704 | version = "2.5.0" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1707 | dependencies = [ 1708 | "proc-macro2", 1709 | "quote", 1710 | "syn", 1711 | ] 1712 | 1713 | [[package]] 1714 | name = "tokio-rustls" 1715 | version = "0.26.1" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" 1718 | dependencies = [ 1719 | "rustls", 1720 | "tokio", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "tokio-socks" 1725 | version = "0.5.2" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" 1728 | dependencies = [ 1729 | "either", 1730 | "futures-util", 1731 | "thiserror 1.0.69", 1732 | "tokio", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "tokio-tungstenite" 1737 | version = "0.26.1" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "be4bf6fecd69fcdede0ec680aaf474cdab988f9de6bc73d3758f0160e3b7025a" 1740 | dependencies = [ 1741 | "futures-util", 1742 | "log", 1743 | "rustls", 1744 | "rustls-pki-types", 1745 | "tokio", 1746 | "tokio-rustls", 1747 | "tungstenite", 1748 | "webpki-roots", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "tokio-util" 1753 | version = "0.7.13" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 1756 | dependencies = [ 1757 | "bytes", 1758 | "futures-core", 1759 | "futures-sink", 1760 | "pin-project-lite", 1761 | "tokio", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "toml" 1766 | version = "0.8.19" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 1769 | dependencies = [ 1770 | "serde", 1771 | "serde_spanned", 1772 | "toml_datetime", 1773 | "toml_edit", 1774 | ] 1775 | 1776 | [[package]] 1777 | name = "toml_datetime" 1778 | version = "0.6.8" 1779 | source = "registry+https://github.com/rust-lang/crates.io-index" 1780 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1781 | dependencies = [ 1782 | "serde", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "toml_edit" 1787 | version = "0.22.22" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 1790 | dependencies = [ 1791 | "indexmap", 1792 | "serde", 1793 | "serde_spanned", 1794 | "toml_datetime", 1795 | "winnow", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "tower" 1800 | version = "0.5.2" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1803 | dependencies = [ 1804 | "futures-core", 1805 | "futures-util", 1806 | "pin-project-lite", 1807 | "sync_wrapper", 1808 | "tokio", 1809 | "tower-layer", 1810 | "tower-service", 1811 | "tracing", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "tower-http" 1816 | version = "0.6.2" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" 1819 | dependencies = [ 1820 | "bitflags", 1821 | "bytes", 1822 | "http", 1823 | "http-body", 1824 | "pin-project-lite", 1825 | "tower-layer", 1826 | "tower-service", 1827 | "tracing", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "tower-layer" 1832 | version = "0.3.3" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1835 | 1836 | [[package]] 1837 | name = "tower-service" 1838 | version = "0.3.3" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1841 | 1842 | [[package]] 1843 | name = "tracing" 1844 | version = "0.1.41" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1847 | dependencies = [ 1848 | "log", 1849 | "pin-project-lite", 1850 | "tracing-attributes", 1851 | "tracing-core", 1852 | ] 1853 | 1854 | [[package]] 1855 | name = "tracing-attributes" 1856 | version = "0.1.28" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1859 | dependencies = [ 1860 | "proc-macro2", 1861 | "quote", 1862 | "syn", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "tracing-core" 1867 | version = "0.1.33" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1870 | dependencies = [ 1871 | "once_cell", 1872 | "valuable", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "tracing-log" 1877 | version = "0.2.0" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1880 | dependencies = [ 1881 | "log", 1882 | "once_cell", 1883 | "tracing-core", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "tracing-subscriber" 1888 | version = "0.3.19" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1891 | dependencies = [ 1892 | "nu-ansi-term", 1893 | "sharded-slab", 1894 | "smallvec", 1895 | "thread_local", 1896 | "tracing-core", 1897 | "tracing-log", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "tungstenite" 1902 | version = "0.26.1" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "413083a99c579593656008130e29255e54dcaae495be556cc26888f211648c24" 1905 | dependencies = [ 1906 | "byteorder", 1907 | "bytes", 1908 | "data-encoding", 1909 | "http", 1910 | "httparse", 1911 | "log", 1912 | "rand", 1913 | "rustls", 1914 | "rustls-pki-types", 1915 | "sha1", 1916 | "thiserror 2.0.11", 1917 | "utf-8", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "typenum" 1922 | version = "1.17.0" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1925 | 1926 | [[package]] 1927 | name = "unicode-ident" 1928 | version = "1.0.15" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" 1931 | 1932 | [[package]] 1933 | name = "unicode-normalization" 1934 | version = "0.1.22" 1935 | source = "registry+https://github.com/rust-lang/crates.io-index" 1936 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1937 | dependencies = [ 1938 | "tinyvec", 1939 | ] 1940 | 1941 | [[package]] 1942 | name = "universal-hash" 1943 | version = "0.5.1" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" 1946 | dependencies = [ 1947 | "crypto-common", 1948 | "subtle", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "untrusted" 1953 | version = "0.9.0" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1956 | 1957 | [[package]] 1958 | name = "url" 1959 | version = "2.5.4" 1960 | source = "registry+https://github.com/rust-lang/crates.io-index" 1961 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1962 | dependencies = [ 1963 | "form_urlencoded", 1964 | "idna", 1965 | "percent-encoding", 1966 | "serde", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "utf-8" 1971 | version = "0.7.6" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1974 | 1975 | [[package]] 1976 | name = "utf16_iter" 1977 | version = "1.0.5" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1980 | 1981 | [[package]] 1982 | name = "utf8_iter" 1983 | version = "1.0.4" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1986 | 1987 | [[package]] 1988 | name = "utf8parse" 1989 | version = "0.2.2" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1992 | 1993 | [[package]] 1994 | name = "valuable" 1995 | version = "0.1.1" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1998 | 1999 | [[package]] 2000 | name = "version_check" 2001 | version = "0.9.5" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2004 | 2005 | [[package]] 2006 | name = "wasi" 2007 | version = "0.11.0+wasi-snapshot-preview1" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2010 | 2011 | [[package]] 2012 | name = "wasm-bindgen" 2013 | version = "0.2.100" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2016 | dependencies = [ 2017 | "cfg-if", 2018 | "once_cell", 2019 | "rustversion", 2020 | "wasm-bindgen-macro", 2021 | ] 2022 | 2023 | [[package]] 2024 | name = "wasm-bindgen-backend" 2025 | version = "0.2.100" 2026 | source = "registry+https://github.com/rust-lang/crates.io-index" 2027 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2028 | dependencies = [ 2029 | "bumpalo", 2030 | "log", 2031 | "proc-macro2", 2032 | "quote", 2033 | "syn", 2034 | "wasm-bindgen-shared", 2035 | ] 2036 | 2037 | [[package]] 2038 | name = "wasm-bindgen-futures" 2039 | version = "0.4.50" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2042 | dependencies = [ 2043 | "cfg-if", 2044 | "js-sys", 2045 | "once_cell", 2046 | "wasm-bindgen", 2047 | "web-sys", 2048 | ] 2049 | 2050 | [[package]] 2051 | name = "wasm-bindgen-macro" 2052 | version = "0.2.100" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2055 | dependencies = [ 2056 | "quote", 2057 | "wasm-bindgen-macro-support", 2058 | ] 2059 | 2060 | [[package]] 2061 | name = "wasm-bindgen-macro-support" 2062 | version = "0.2.100" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2065 | dependencies = [ 2066 | "proc-macro2", 2067 | "quote", 2068 | "syn", 2069 | "wasm-bindgen-backend", 2070 | "wasm-bindgen-shared", 2071 | ] 2072 | 2073 | [[package]] 2074 | name = "wasm-bindgen-shared" 2075 | version = "0.2.100" 2076 | source = "registry+https://github.com/rust-lang/crates.io-index" 2077 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2078 | dependencies = [ 2079 | "unicode-ident", 2080 | ] 2081 | 2082 | [[package]] 2083 | name = "web-sys" 2084 | version = "0.3.77" 2085 | source = "registry+https://github.com/rust-lang/crates.io-index" 2086 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2087 | dependencies = [ 2088 | "js-sys", 2089 | "wasm-bindgen", 2090 | ] 2091 | 2092 | [[package]] 2093 | name = "webpki-roots" 2094 | version = "0.26.7" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" 2097 | dependencies = [ 2098 | "rustls-pki-types", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "winapi" 2103 | version = "0.3.9" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2106 | dependencies = [ 2107 | "winapi-i686-pc-windows-gnu", 2108 | "winapi-x86_64-pc-windows-gnu", 2109 | ] 2110 | 2111 | [[package]] 2112 | name = "winapi-i686-pc-windows-gnu" 2113 | version = "0.4.0" 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" 2115 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2116 | 2117 | [[package]] 2118 | name = "winapi-x86_64-pc-windows-gnu" 2119 | version = "0.4.0" 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" 2121 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2122 | 2123 | [[package]] 2124 | name = "windows-sys" 2125 | version = "0.52.0" 2126 | source = "registry+https://github.com/rust-lang/crates.io-index" 2127 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2128 | dependencies = [ 2129 | "windows-targets", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "windows-sys" 2134 | version = "0.59.0" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2137 | dependencies = [ 2138 | "windows-targets", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "windows-targets" 2143 | version = "0.52.6" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2146 | dependencies = [ 2147 | "windows_aarch64_gnullvm", 2148 | "windows_aarch64_msvc", 2149 | "windows_i686_gnu", 2150 | "windows_i686_gnullvm", 2151 | "windows_i686_msvc", 2152 | "windows_x86_64_gnu", 2153 | "windows_x86_64_gnullvm", 2154 | "windows_x86_64_msvc", 2155 | ] 2156 | 2157 | [[package]] 2158 | name = "windows_aarch64_gnullvm" 2159 | version = "0.52.6" 2160 | source = "registry+https://github.com/rust-lang/crates.io-index" 2161 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2162 | 2163 | [[package]] 2164 | name = "windows_aarch64_msvc" 2165 | version = "0.52.6" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2168 | 2169 | [[package]] 2170 | name = "windows_i686_gnu" 2171 | version = "0.52.6" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2174 | 2175 | [[package]] 2176 | name = "windows_i686_gnullvm" 2177 | version = "0.52.6" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2180 | 2181 | [[package]] 2182 | name = "windows_i686_msvc" 2183 | version = "0.52.6" 2184 | source = "registry+https://github.com/rust-lang/crates.io-index" 2185 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2186 | 2187 | [[package]] 2188 | name = "windows_x86_64_gnu" 2189 | version = "0.52.6" 2190 | source = "registry+https://github.com/rust-lang/crates.io-index" 2191 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2192 | 2193 | [[package]] 2194 | name = "windows_x86_64_gnullvm" 2195 | version = "0.52.6" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2198 | 2199 | [[package]] 2200 | name = "windows_x86_64_msvc" 2201 | version = "0.52.6" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2204 | 2205 | [[package]] 2206 | name = "winnow" 2207 | version = "0.6.24" 2208 | source = "registry+https://github.com/rust-lang/crates.io-index" 2209 | checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" 2210 | dependencies = [ 2211 | "memchr", 2212 | ] 2213 | 2214 | [[package]] 2215 | name = "write16" 2216 | version = "1.0.0" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2219 | 2220 | [[package]] 2221 | name = "writeable" 2222 | version = "0.5.5" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2225 | 2226 | [[package]] 2227 | name = "yoke" 2228 | version = "0.7.5" 2229 | source = "registry+https://github.com/rust-lang/crates.io-index" 2230 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2231 | dependencies = [ 2232 | "serde", 2233 | "stable_deref_trait", 2234 | "yoke-derive", 2235 | "zerofrom", 2236 | ] 2237 | 2238 | [[package]] 2239 | name = "yoke-derive" 2240 | version = "0.7.5" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2243 | dependencies = [ 2244 | "proc-macro2", 2245 | "quote", 2246 | "syn", 2247 | "synstructure", 2248 | ] 2249 | 2250 | [[package]] 2251 | name = "zerocopy" 2252 | version = "0.7.35" 2253 | source = "registry+https://github.com/rust-lang/crates.io-index" 2254 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2255 | dependencies = [ 2256 | "byteorder", 2257 | "zerocopy-derive", 2258 | ] 2259 | 2260 | [[package]] 2261 | name = "zerocopy-derive" 2262 | version = "0.7.35" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2265 | dependencies = [ 2266 | "proc-macro2", 2267 | "quote", 2268 | "syn", 2269 | ] 2270 | 2271 | [[package]] 2272 | name = "zerofrom" 2273 | version = "0.1.5" 2274 | source = "registry+https://github.com/rust-lang/crates.io-index" 2275 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 2276 | dependencies = [ 2277 | "zerofrom-derive", 2278 | ] 2279 | 2280 | [[package]] 2281 | name = "zerofrom-derive" 2282 | version = "0.1.5" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 2285 | dependencies = [ 2286 | "proc-macro2", 2287 | "quote", 2288 | "syn", 2289 | "synstructure", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "zeroize" 2294 | version = "1.8.1" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2297 | 2298 | [[package]] 2299 | name = "zerovec" 2300 | version = "0.10.4" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2303 | dependencies = [ 2304 | "yoke", 2305 | "zerofrom", 2306 | "zerovec-derive", 2307 | ] 2308 | 2309 | [[package]] 2310 | name = "zerovec-derive" 2311 | version = "0.10.3" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2314 | dependencies = [ 2315 | "proc-macro2", 2316 | "quote", 2317 | "syn", 2318 | ] 2319 | --------------------------------------------------------------------------------