diff --git a/CLAUDE.md b/CLAUDE.md index 5f2ad54..3f4f216 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -65,8 +65,8 @@ This is a polyglot SDK: one Rust core library with Python, Node.js, and Ruby bin - `ruby/` — Ruby package directory (`lib/quicknode_sdk.rb` entry point, `examples/`) ### Core Pattern -- `QuickNodeSdk` is the root entry point holding sub-clients (e.g., `admin: AdminApiClient`). All clients share a `SdkConfig(Arc)` wrapping one `reqwest` HTTP client and the API key. -- There are clients per QuickNode product, with functions mapping to API calls +- `QuicknodeSdk` is the root entry point holding sub-clients (e.g., `admin: AdminApiClient`). All clients share a `SdkConfig(Arc)` wrapping one `reqwest` HTTP client and the API key. +- There are clients per Quicknode product, with functions mapping to API calls - Request params and Responses should be fully typed structs ### Per-Sub-Client Config Pattern @@ -114,17 +114,17 @@ Each binding exposes a typed exception hierarchy rooted at a shared base class s | `SdkError` variant | Python / Ruby class | Node class | Base | |---|---|---|---| -| `Config`, `UrlParse` | `ConfigError` | `ConfigError` | `QuickNodeError` | +| `Config`, `UrlParse` | `ConfigError` | `ConfigError` | `QuicknodeError` | | `Http` + `HttpKind::Timeout` | `TimeoutError` | `TimeoutError` | `HttpError` | | `Http` + `HttpKind::Connect` | `ConnectionError` | `ConnectionError` | `HttpError` | -| `Http` + `HttpKind::Other` | `HttpError` | `HttpError` | `QuickNodeError` | -| `Api { status, body }` | `ApiError` (with `.status`, `.body`) | `ApiError` (with `.status`, `.body`) | `QuickNodeError` | -| `Decode { body, .. }` | `DecodeError` (with `.body`) | `DecodeError` (with `.body`) | `QuickNodeError` | +| `Http` + `HttpKind::Other` | `HttpError` | `HttpError` | `QuicknodeError` | +| `Api { status, body }` | `ApiError` (with `.status`, `.body`) | `ApiError` (with `.status`, `.body`) | `QuicknodeError` | +| `Decode { body, .. }` | `DecodeError` (with `.body`) | `DecodeError` (with `.body`) | `QuicknodeError` | Each binding owns its mapping in a dedicated `errors.rs` file: - **Python** — `crates/python/src/errors.rs` uses `create_exception!` macros; `map_sdk_err` sets `.status` / `.body` attributes via `setattr` on the exception instance. Exceptions are registered on the module in `add_to_module`. - **Node** — `crates/node/src/errors.rs` encodes the variant, status, and body into a tagged message (`[||]\x1f`) because napi-rs only supports plain `napi::Error`. The JS wrapper `npm/errors.js` (`fromNapiError` + `wrapClient` Proxy) parses the prefix and rethrows as the typed subclass. All client methods must be wrapped via `wrapClient` so sync throws and rejected promises are both re-tagged. -- **Ruby** — `crates/ruby/src/errors.rs` uses `module.define_error` to build the class hierarchy under `QuickNodeSdk::Error`; `map_err` instantiates the class and sets `@status` / `@body` ivars (exposed via `attr_reader`-style methods). Classes are captured once in a `OnceLock>`. +- **Ruby** — `crates/ruby/src/errors.rs` uses `module.define_error` to build the class hierarchy under `QuicknodeSdk::Error`; `map_err` instantiates the class and sets `@status` / `@body` ivars (exposed via `attr_reader`-style methods). Classes are captured once in a `OnceLock>`. When adding a new `SdkError` variant: 1. Add the variant to `crates/core/src/errors.rs` and update `http_kind()` if it's transport-level. @@ -139,7 +139,7 @@ When adding a new `SdkError` variant: `crates/node/src/lib.rs` uses `#[napi(constructor)]` and `#[napi(getter)]` macros. napi handles async conversion automatically. ### Ruby Binding Pattern -`crates/ruby/src/lib.rs` uses the `magnus` crate. All async SDK calls are wrapped via a single shared `tokio::runtime` (static `OnceLock`) using `.block_on()` to produce a synchronous Ruby API. Methods returning data return **JSON strings** — callers must parse with `JSON.parse()`. All parameters are passed as a single Ruby Hash with symbol keys (e.g. `get_endpoints(limit: 20)`). Required keys throw `ArgumentError` if missing; unknown keys also throw `ArgumentError` (validated via `validate_keys`). The magnus arity limit of 15 is why this pattern is used uniformly — all methods are registered with arity `1` (or `0` for zero-param methods). Classes are exposed under the `QuickNodeSdk` module and registered via `#[magnus::init(name = "quicknode_sdk")]`. +`crates/ruby/src/lib.rs` uses the `magnus` crate. All async SDK calls are wrapped via a single shared `tokio::runtime` (static `OnceLock`) using `.block_on()` to produce a synchronous Ruby API. Methods returning data return **JSON strings** — callers must parse with `JSON.parse()`. All parameters are passed as a single Ruby Hash with symbol keys (e.g. `get_endpoints(limit: 20)`). Required keys throw `ArgumentError` if missing; unknown keys also throw `ArgumentError` (validated via `validate_keys`). The magnus arity limit of 15 is why this pattern is used uniformly — all methods are registered with arity `1` (or `0` for zero-param methods). Classes are exposed under the `QuicknodeSdk` module and registered via `#[magnus::init(name = "quicknode_sdk")]`. When adding a new Ruby method: 1. Accept `opts: RHash` as the single parameter diff --git a/README.md b/README.md index 53d4658..dd211e8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Quicknode SDK -A unified SDK for building on QuickNode. +A unified SDK for building on Quicknode. Rust SDK with Python, Node.js, and Ruby bindings. @@ -73,7 +73,7 @@ sdk/ **Node.js:** `npm install quicknode-sdk` -**Ruby:** `gem install quicknode-sdk` _(not yet published — see Development below)_ +**Ruby:** `gem install quicknode_sdk` ## Quick Start @@ -81,11 +81,11 @@ Construct the SDK once, then reach into the four sub-clients (`admin`, `streams` ```rust // Rust -use quicknode_sdk::{QuickNodeSdk, SdkFullConfig}; +use quicknode_sdk::{QuicknodeSdk, SdkFullConfig}; #[tokio::main] async fn main() -> Result<(), Box> { - let qn = QuickNodeSdk::from_env()?; + let qn = QuicknodeSdk::from_env()?; let resp = qn.admin.get_endpoints(&Default::default()).await?; println!("{} endpoints", resp.data.len()); Ok(()) @@ -95,10 +95,10 @@ async fn main() -> Result<(), Box> { ```python # Python import asyncio -from sdk import QuickNodeSdk +from sdk import QuicknodeSdk async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() resp = await qn.admin.get_endpoints() print(f"{len(resp.data)} endpoints") @@ -107,9 +107,9 @@ asyncio.run(main()) ```typescript // Node.js -import { QuickNodeSdk } from "quicknode-sdk"; +import { QuicknodeSdk } from "quicknode-sdk"; -const qn = QuickNodeSdk.fromEnv(); +const qn = QuicknodeSdk.fromEnv(); const resp = await qn.admin.getEndpoints(); console.log(`${resp.data.length} endpoints`); ``` @@ -119,7 +119,7 @@ console.log(`${resp.data.length} endpoints`); require "json" require "quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env resp = JSON.parse(qn.admin.get_endpoints({})) puts "#{resp["data"].length} endpoints" ``` @@ -132,45 +132,45 @@ There are two ways to configure the SDK. ```python # Python -from sdk import QuickNodeSdk, SdkFullConfig, HttpConfig -qn = QuickNodeSdk(SdkFullConfig(api_key="your-key", http=HttpConfig(timeout_secs=30))) +from sdk import QuicknodeSdk, SdkFullConfig, HttpConfig +qn = QuicknodeSdk(SdkFullConfig(api_key="your-key", http=HttpConfig(timeout_secs=30))) ``` ```typescript // Node.js -import { QuickNodeSdk } from "quicknode-sdk"; -const qn = new QuickNodeSdk({ apiKey: "your-key", http: { timeoutSecs: 30 } }); +import { QuicknodeSdk } from "quicknode-sdk"; +const qn = new QuicknodeSdk({ apiKey: "your-key", http: { timeoutSecs: 30 } }); ``` ```rust // Rust -let qn = QuickNodeSdk::new(&SdkFullConfig::builder().api_key("your-key").build())?; +let qn = QuicknodeSdk::new(&SdkFullConfig::builder().api_key("your-key").build())?; ``` ### Option B — Load from environment (`from_env()`) ```python # Python -qn = QuickNodeSdk.from_env() +qn = QuicknodeSdk.from_env() ``` ```typescript // Node.js -const qn = QuickNodeSdk.fromEnv(); +const qn = QuicknodeSdk.fromEnv(); ``` ```ruby # Ruby -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env ``` ```rust // Rust -let qn = QuickNodeSdk::from_env()?; +let qn = QuicknodeSdk::from_env()?; ``` Environment variables (prefix `QN_SDK__`, separator `__`): | Variable | Required | Default | Description | |----------|----------|---------|-------------| -| `QN_SDK__API_KEY` | yes | — | Your QuickNode API key | +| `QN_SDK__API_KEY` | yes | — | Your Quicknode API key | | `QN_SDK__HTTP__TIMEOUT_SECS` | no | 30 | HTTP request timeout in seconds | | `QN_SDK__HTTP__POOL_MAX_IDLE_PER_HOST` | no | — | Max idle HTTP connections per host | | `QN_SDK__ADMIN__BASE_URL` | no | `https://api.quicknode.com/v0/` | Override admin API base URL (HTTPS, must end with `/`) | @@ -1796,7 +1796,7 @@ resp = JSON.parse(qn.admin.get_account_metrics(period: "day", metric: "credits_o ##### `list_chains` / `listChains` -Lists the blockchains supported by QuickNode along with their networks. +Lists the blockchains supported by Quicknode along with their networks. **Parameters**: none. @@ -2104,7 +2104,7 @@ Wrapper naming per language: - **Rust**: `DestinationAttributes::Webhook(WebhookAttributes { .. })` etc. - **Python**: `StreamWebhookDestination(WebhookAttributes(...))`, `StreamS3Destination(S3Attributes(...))`, etc. - **Node.js**: a discriminated object `{ destination: "webhook", attributes: { ... } }` using string discriminators. -- **Ruby**: factory methods on `QuickNodeSdk::DestinationAttributes`, e.g. `QuickNodeSdk::DestinationAttributes.webhook(url: ..., ...)`. +- **Ruby**: factory methods on `QuicknodeSdk::DestinationAttributes`, e.g. `QuicknodeSdk::DestinationAttributes.webhook(url: ..., ...)`. #### Streams methods @@ -2195,7 +2195,7 @@ const stream = await qn.streams.createStream({ ```ruby # Ruby -dest = QuickNodeSdk::DestinationAttributes.webhook( +dest = QuicknodeSdk::DestinationAttributes.webhook( url: "https://webhook.site/...", max_retry: 3, retry_interval_sec: 1, @@ -3303,13 +3303,13 @@ qn.kvstore.delete_list(key: "my-list") ## Error Handling Every binding exposes a typed exception hierarchy derived from the core `SdkError` -enum (`crates/core/src/errors.rs`). Catch the base class (`QuickNodeError` / -`QuickNodeSdk::Error` / `SdkError`) for any SDK-originated failure, or a specific +enum (`crates/core/src/errors.rs`). Catch the base class (`QuicknodeError` / +`QuicknodeSdk::Error` / `SdkError`) for any SDK-originated failure, or a specific subclass to branch on transport vs. API semantics. | Logical class | When it fires | Extra fields | |----------------------|-------------------------------------------------------------|----------------------| -| `QuickNodeError` | base class; catches everything below | — | +| `QuicknodeError` | base class; catches everything below | — | | `ConfigError` | invalid config or URL surfaced at construction time | — | | `HttpError` | transport failure that isn't a timeout/connect | — | | `TimeoutError` | request timed out (subclass of `HttpError`) | — | @@ -3320,9 +3320,9 @@ subclass to branch on transport vs. API semantics. Per-language names: - **Rust** — pattern-match on `SdkError { Http, Api, Decode, UrlParse, Config }`; use `err.http_kind()` to classify `Http` into `Timeout`, `Connect`, or `Other`. -- **Python** — `QuickNodeError`, `ConfigError`, `HttpError`, `TimeoutError`, `ConnectionError`, `ApiError`, `DecodeError` (importable from `sdk`). +- **Python** — `QuicknodeError`, `ConfigError`, `HttpError`, `TimeoutError`, `ConnectionError`, `ApiError`, `DecodeError` (importable from `sdk`). - **Node.js** — same class names, importable from `@quicknode/sdk`, all extend `Error`. -- **Ruby** — `QuickNodeSdk::Error`, `QuickNodeSdk::ConfigError`, `QuickNodeSdk::HttpError`, `QuickNodeSdk::TimeoutError`, `QuickNodeSdk::ConnectionError`, `QuickNodeSdk::ApiError`, `QuickNodeSdk::DecodeError`; all extend `StandardError`. Hash-key validation still raises `ArgumentError`. +- **Ruby** — `QuicknodeSdk::Error`, `QuicknodeSdk::ConfigError`, `QuicknodeSdk::HttpError`, `QuicknodeSdk::TimeoutError`, `QuicknodeSdk::ConnectionError`, `QuicknodeSdk::ApiError`, `QuicknodeSdk::DecodeError`; all extend `StandardError`. Hash-key validation still raises `ArgumentError`. ```rust // Rust @@ -3366,9 +3366,9 @@ try { # Ruby begin qn.admin.show_endpoint(id: "missing") -rescue QuickNodeSdk::ApiError => e +rescue QuicknodeSdk::ApiError => e warn "api #{e.status}: #{e.body}" if e.status == 404 -rescue QuickNodeSdk::TimeoutError +rescue QuicknodeSdk::TimeoutError warn "timed out" end ``` @@ -3553,7 +3553,7 @@ The Python package is published to PyPI as `quicknode-sdk`. Wheels and the sdist 5. **Verify.** ```bash pip install quicknode-sdk==0.1.0a6 - python -c "import sdk; print(sdk.QuickNodeSdk)" + python -c "import sdk; print(sdk.QuicknodeSdk)" ``` **First publish:** the repo secret `PYPI_API_TOKEN` must be set. Project-scoped tokens only work after the project exists on PyPI, so the first upload needs a user-scoped token; rotate to a project-scoped token after. diff --git a/crates/core/examples/admin.rs b/crates/core/examples/admin.rs index 7e7079d..6af1867 100644 --- a/crates/core/examples/admin.rs +++ b/crates/core/examples/admin.rs @@ -1,10 +1,10 @@ -use quicknode_sdk::{admin::GetEndpointsRequest, QuickNodeSdk, SdkFullConfig}; +use quicknode_sdk::{admin::GetEndpointsRequest, QuicknodeSdk, SdkFullConfig}; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); let params = GetEndpointsRequest::builder() .limit(20) diff --git a/crates/core/examples/admin_e2e.rs b/crates/core/examples/admin_e2e.rs index a2cae71..542c2ac 100644 --- a/crates/core/examples/admin_e2e.rs +++ b/crates/core/examples/admin_e2e.rs @@ -11,14 +11,14 @@ use quicknode_sdk::{ UpdateTeamEndpointsRequest, }, errors::SdkError, - AdminConfig, HttpConfig, QuickNodeSdk, SdkFullConfig, + AdminConfig, HttpConfig, QuicknodeSdk, SdkFullConfig, }; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); let run_suffix = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) @@ -821,7 +821,7 @@ async fn main() { webhooks: None, kvstore: None, }; - let tiny = QuickNodeSdk::new(&blackhole).expect("build tiny sdk"); + let tiny = QuicknodeSdk::new(&blackhole).expect("build tiny sdk"); match tiny .admin .get_endpoints(&GetEndpointsRequest::default()) diff --git a/crates/core/examples/kvstore_e2e.rs b/crates/core/examples/kvstore_e2e.rs index 1ac76e7..4c80930 100644 --- a/crates/core/examples/kvstore_e2e.rs +++ b/crates/core/examples/kvstore_e2e.rs @@ -4,14 +4,14 @@ use quicknode_sdk::{ kvstore::{ AddListItemParams, BulkSetsParams, CreateListParams, CreateSetParams, UpdateListParams, }, - QuickNodeSdk, SdkFullConfig, + QuicknodeSdk, SdkFullConfig, }; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); // ── Sets ──────────────────────────────────────────────────────────────── diff --git a/crates/core/examples/streams.rs b/crates/core/examples/streams.rs index c84d621..6e47a21 100644 --- a/crates/core/examples/streams.rs +++ b/crates/core/examples/streams.rs @@ -3,14 +3,14 @@ use quicknode_sdk::{ CreateStreamParams, DestinationAttributes, StreamDataset, StreamMetadataLocation, StreamRegion, StreamStatus, WebhookAttributes, }, - QuickNodeSdk, SdkFullConfig, + QuicknodeSdk, SdkFullConfig, }; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); let params = CreateStreamParams::builder() .name("My Stream".to_string()) diff --git a/crates/core/examples/streams_e2e.rs b/crates/core/examples/streams_e2e.rs index 25792e8..83902cf 100644 --- a/crates/core/examples/streams_e2e.rs +++ b/crates/core/examples/streams_e2e.rs @@ -6,14 +6,14 @@ use quicknode_sdk::{ StreamMetadataLocation, StreamRegion, StreamStatus, TestFilterParams, UpdateStreamParams, WebhookAttributes, }, - QuickNodeSdk, SdkFullConfig, + QuicknodeSdk, SdkFullConfig, }; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); let before = qn .streams diff --git a/crates/core/examples/webhooks_e2e.rs b/crates/core/examples/webhooks_e2e.rs index 2405b36..d7dae34 100644 --- a/crates/core/examples/webhooks_e2e.rs +++ b/crates/core/examples/webhooks_e2e.rs @@ -6,14 +6,14 @@ use quicknode_sdk::{ GetWebhooksParams, TemplateArgs, UpdateWebhookParams, WebhookDestinationAttributes, WebhookStartFrom, }, - QuickNodeSdk, SdkFullConfig, + QuicknodeSdk, SdkFullConfig, }; #[tokio::main] #[allow(clippy::unwrap_used, clippy::expect_used)] async fn main() { let config = SdkFullConfig::from_env().expect("Config from env failed"); - let qn = QuickNodeSdk::new(&config).expect("sdk failed to initialize"); + let qn = QuicknodeSdk::new(&config).expect("sdk failed to initialize"); let before = qn .webhooks diff --git a/crates/core/src/admin/chains.rs b/crates/core/src/admin/chains.rs index 4d85687..aa0a8f0 100644 --- a/crates/core/src/admin/chains.rs +++ b/crates/core/src/admin/chains.rs @@ -20,7 +20,7 @@ pub struct ChainNetwork { pub chain_id: Option, } -/// A blockchain supported by QuickNode along with its networks. +/// A blockchain supported by Quicknode along with its networks. #[cfg_attr(feature = "python", gen_stub_pyclass)] #[cfg_attr(feature = "python", pyclass(get_all, set_all))] #[cfg_attr(feature = "node", napi(object))] diff --git a/crates/core/src/admin/endpoint_security.rs b/crates/core/src/admin/endpoint_security.rs index cc47e32..ee02edf 100644 --- a/crates/core/src/admin/endpoint_security.rs +++ b/crates/core/src/admin/endpoint_security.rs @@ -127,7 +127,7 @@ pub struct CreateIpRequest { #[cfg_attr(feature = "rust", derive(Builder))] #[derive(Debug, Clone, Default, Serialize)] pub struct CreateDomainMaskRequest { - /// Custom domain that will mask the endpoint's QuickNode URL. + /// Custom domain that will mask the endpoint's Quicknode URL. #[serde(skip_serializing_if = "Option::is_none")] pub domain_mask: Option, } diff --git a/crates/core/src/admin/endpoints.rs b/crates/core/src/admin/endpoints.rs index 2358b94..a308fe3 100644 --- a/crates/core/src/admin/endpoints.rs +++ b/crates/core/src/admin/endpoints.rs @@ -90,7 +90,7 @@ pub struct Pagination { pub struct Endpoint { /// Unique endpoint identifier. pub id: String, - /// QuickNode-assigned subdomain. + /// Quicknode-assigned subdomain. pub name: String, /// Human-readable label. pub label: Option, diff --git a/crates/core/src/admin/mod.rs b/crates/core/src/admin/mod.rs index 43d4a3d..31b9927 100644 --- a/crates/core/src/admin/mod.rs +++ b/crates/core/src/admin/mod.rs @@ -88,7 +88,7 @@ impl ResolvedAdminConfig { } } -/// Client for the QuickNode Admin API. Manage endpoints, tags, teams, billing, +/// Client for the Quicknode Admin API. Manage endpoints, tags, teams, billing, /// usage/metrics, security, and rate limits on the account. #[derive(Debug, Clone)] pub struct AdminApiClient { @@ -945,7 +945,7 @@ impl AdminApiClient { } /// Adds a domain mask to an endpoint — a custom domain used to hide the - /// endpoint's QuickNode URL so requests can be routed through your own + /// endpoint's Quicknode URL so requests can be routed through your own /// domain. pub async fn create_domain_mask( &self, @@ -1451,7 +1451,7 @@ impl AdminApiClient { serde_json::from_str(&body).map_err(|source| SdkError::Decode { source, body }) } - /// Returns all chains supported by QuickNode along with their networks. + /// Returns all chains supported by Quicknode along with their networks. /// Each entry includes the chain slug and its network slugs and names. pub async fn list_chains(&self) -> Result { let url = self.config.admin().base_url.join("chains")?; @@ -1800,12 +1800,12 @@ fn endpoints_query(params: &GetEndpointsRequest) -> Vec<(&'static str, String)> #[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] mod tests { use super::*; - use crate::{AdminConfig, QuickNodeSdk, SdkFullConfig}; + use crate::{AdminConfig, QuicknodeSdk, SdkFullConfig}; use wiremock::matchers::{method, path, query_param}; use wiremock::{Mock, MockServer, ResponseTemplate}; - fn make_sdk(base_url: String) -> QuickNodeSdk { - QuickNodeSdk::new(&SdkFullConfig { + fn make_sdk(base_url: String) -> QuicknodeSdk { + QuicknodeSdk::new(&SdkFullConfig { api_key: "test-key".to_string(), http: None, admin: Some(AdminConfig { diff --git a/crates/core/src/kvstore/mod.rs b/crates/core/src/kvstore/mod.rs index 33069ad..3c63095 100644 --- a/crates/core/src/kvstore/mod.rs +++ b/crates/core/src/kvstore/mod.rs @@ -325,7 +325,7 @@ struct ApiResponse { // ── Client ───────────────────────────────────────────────────────────────── -/// Client for the QuickNode Key-Value Store. Supports two primitives: *sets* +/// Client for the Quicknode Key-Value Store. Supports two primitives: *sets* /// (single string values under a key) and *lists* (ordered collections of /// strings under a key). #[derive(Debug, Clone)] @@ -668,12 +668,12 @@ impl KvStoreApiClient { #[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] mod tests { use super::*; - use crate::{KvStoreConfig, QuickNodeSdk, SdkFullConfig}; + use crate::{KvStoreConfig, QuicknodeSdk, SdkFullConfig}; use wiremock::matchers::{method, path}; use wiremock::{Mock, MockServer, ResponseTemplate}; - fn make_sdk(base_url: String) -> QuickNodeSdk { - QuickNodeSdk::new(&SdkFullConfig { + fn make_sdk(base_url: String) -> QuicknodeSdk { + QuicknodeSdk::new(&SdkFullConfig { api_key: "test-key".to_string(), http: None, admin: None, diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 110b93b..02e5703 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -118,9 +118,9 @@ impl SdkConfig { } } -/// Top-level entry point for the QuickNode SDK. Holds sub-clients for each +/// Top-level entry point for the Quicknode SDK. Holds sub-clients for each /// product area; all share a single HTTP client and API key. -pub struct QuickNodeSdk { +pub struct QuicknodeSdk { /// Admin API client: manages endpoints, tags, teams, billing, usage, /// metrics, security, and rate limits. pub admin: admin::AdminApiClient, @@ -133,7 +133,7 @@ pub struct QuickNodeSdk { pub kvstore: kvstore::KvStoreApiClient, } -impl QuickNodeSdk { +impl QuicknodeSdk { /// Creates a new SDK instance from an explicit configuration. pub fn new(config: &SdkFullConfig) -> Result { let sdk_config = SdkConfig::new(config)?; diff --git a/crates/core/src/streams/mod.rs b/crates/core/src/streams/mod.rs index 76a9876..ee24d53 100644 --- a/crates/core/src/streams/mod.rs +++ b/crates/core/src/streams/mod.rs @@ -32,7 +32,7 @@ impl ResolvedStreamsConfig { // ── Client ───────────────────────────────────────────────────────────────── -/// Client for the QuickNode Streams REST API. Create, list, update, and control +/// Client for the Quicknode Streams REST API. Create, list, update, and control /// blockchain data streams that deliver filtered on-chain events to configured /// destinations. #[derive(Debug, Clone)] @@ -314,12 +314,12 @@ impl StreamsApiClient { #[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] mod tests { use super::*; - use crate::{QuickNodeSdk, SdkFullConfig, StreamsConfig}; + use crate::{QuicknodeSdk, SdkFullConfig, StreamsConfig}; use wiremock::matchers::{method, path}; use wiremock::{Mock, MockServer, ResponseTemplate}; - fn make_sdk(base_url: String) -> QuickNodeSdk { - QuickNodeSdk::new(&SdkFullConfig { + fn make_sdk(base_url: String) -> QuicknodeSdk { + QuicknodeSdk::new(&SdkFullConfig { api_key: "test-key".to_string(), http: None, admin: None, diff --git a/crates/core/src/streams/stream.rs b/crates/core/src/streams/stream.rs index 9765331..88e1b57 100644 --- a/crates/core/src/streams/stream.rs +++ b/crates/core/src/streams/stream.rs @@ -984,7 +984,7 @@ pub struct Stream { /// Whether elastic batching is active. #[serde(skip_serializing_if = "Option::is_none")] pub elastic_batch_enabled: Option, - /// QuickNode account ID that owns the stream. + /// Quicknode account ID that owns the stream. #[serde(skip_serializing_if = "Option::is_none")] pub qn_account_id: Option, /// Minimum charge cap applied to the stream's billing. diff --git a/crates/core/src/webhooks/mod.rs b/crates/core/src/webhooks/mod.rs index e17881e..194cd43 100644 --- a/crates/core/src/webhooks/mod.rs +++ b/crates/core/src/webhooks/mod.rs @@ -32,7 +32,7 @@ impl ResolvedWebhooksConfig { // ── Client ───────────────────────────────────────────────────────────────── -/// Client for the QuickNode Webhooks REST API. Create webhooks from filter +/// Client for the Quicknode Webhooks REST API. Create webhooks from filter /// templates, manage their lifecycle, and update their destinations. #[derive(Debug, Clone)] pub struct WebhooksApiClient { @@ -351,12 +351,12 @@ impl WebhooksApiClient { #[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] mod tests { use super::*; - use crate::{QuickNodeSdk, SdkFullConfig, WebhooksConfig}; + use crate::{QuicknodeSdk, SdkFullConfig, WebhooksConfig}; use wiremock::matchers::{method, path, path_regex}; use wiremock::{Mock, MockServer, ResponseTemplate}; - fn make_sdk(base_url: String) -> QuickNodeSdk { - QuickNodeSdk::new(&SdkFullConfig { + fn make_sdk(base_url: String) -> QuicknodeSdk { + QuicknodeSdk::new(&SdkFullConfig { api_key: "test-key".to_string(), http: None, admin: None, diff --git a/crates/node/src/lib.rs b/crates/node/src/lib.rs index f2df34c..e64ad25 100644 --- a/crates/node/src/lib.rs +++ b/crates/node/src/lib.rs @@ -8,7 +8,7 @@ mod streams_destination; // ── Top-level SDK ────────────────────────────────────────────── #[napi] -pub struct QuickNodeSdk { +pub struct QuicknodeSdk { admin: AdminApiClient, streams: StreamsApiClient, webhooks: WebhooksApiClient, @@ -16,7 +16,7 @@ pub struct QuickNodeSdk { } #[napi] -impl QuickNodeSdk { +impl QuicknodeSdk { /// Creates a new SDK instance from an explicit configuration. #[napi(constructor)] #[allow(clippy::needless_pass_by_value)] @@ -65,7 +65,7 @@ impl QuickNodeSdk { /// Creates a new SDK instance using configuration from environment variables. #[napi(factory)] pub fn from_env() -> Result { - core::QuickNodeSdk::from_env() + core::QuicknodeSdk::from_env() .map(|sdk| Self { admin: AdminApiClient { inner: sdk.admin }, streams: StreamsApiClient { inner: sdk.streams }, @@ -390,7 +390,7 @@ impl AdminApiClient { } /// Adds a domain mask to an endpoint — a custom domain used to hide the - /// endpoint's QuickNode URL so requests can be routed through your own + /// endpoint's Quicknode URL so requests can be routed through your own /// domain. #[napi] pub async fn create_domain_mask( @@ -633,7 +633,7 @@ impl AdminApiClient { .map_err(errors::map_sdk_err) } - /// Returns all chains supported by QuickNode along with their networks. + /// Returns all chains supported by Quicknode along with their networks. /// Each entry includes the chain slug and its network slugs and names. #[napi] pub async fn list_chains(&self) -> Result { diff --git a/crates/python/src/errors.rs b/crates/python/src/errors.rs index 2532c74..1725a6d 100644 --- a/crates/python/src/errors.rs +++ b/crates/python/src/errors.rs @@ -12,13 +12,13 @@ pub fn map_parse_err(e: serde_json::Error) -> PyErr { PyValueError::new_err(e.to_string()) } -create_exception!(_core, QuickNodeError, PyException); -create_exception!(_core, ConfigError, QuickNodeError); -create_exception!(_core, HttpError, QuickNodeError); +create_exception!(_core, QuicknodeError, PyException); +create_exception!(_core, ConfigError, QuicknodeError); +create_exception!(_core, HttpError, QuicknodeError); create_exception!(_core, TimeoutError, HttpError); create_exception!(_core, ConnectionError, HttpError); -create_exception!(_core, ApiError, QuickNodeError); -create_exception!(_core, DecodeError, QuickNodeError); +create_exception!(_core, ApiError, QuicknodeError); +create_exception!(_core, DecodeError, QuicknodeError); #[allow(clippy::needless_pass_by_value)] pub fn map_sdk_err(e: SdkError) -> PyErr { @@ -57,7 +57,7 @@ pub fn map_sdk_err(e: SdkError) -> PyErr { pub fn add_to_module(m: &Bound<'_, PyModule>) -> PyResult<()> { let py = m.py(); - m.add("QuickNodeError", py.get_type::())?; + m.add("QuicknodeError", py.get_type::())?; m.add("ConfigError", py.get_type::())?; m.add("HttpError", py.get_type::())?; m.add("TimeoutError", py.get_type::())?; diff --git a/crates/python/src/lib.rs b/crates/python/src/lib.rs index c16bcfc..70aa4c2 100644 --- a/crates/python/src/lib.rs +++ b/crates/python/src/lib.rs @@ -12,7 +12,7 @@ mod streams_destination; #[gen_stub_pyclass] #[pyclass] -pub struct QuickNodeSdk { +pub struct QuicknodeSdk { #[pyo3(get)] admin: AdminApiClient, #[pyo3(get)] @@ -25,7 +25,7 @@ pub struct QuickNodeSdk { #[gen_stub_pymethods] #[pymethods] -impl QuickNodeSdk { +impl QuicknodeSdk { /// Creates a new SDK instance from an explicit configuration. #[new] #[allow(clippy::needless_pass_by_value)] @@ -50,7 +50,7 @@ impl QuickNodeSdk { /// Creates a new SDK instance using configuration from environment variables. #[staticmethod] fn from_env() -> PyResult { - core::QuickNodeSdk::from_env() + core::QuicknodeSdk::from_env() .map(|sdk| Self { admin: AdminApiClient { inner: sdk.admin }, streams: StreamsApiClient { inner: sdk.streams }, @@ -595,7 +595,7 @@ impl AdminApiClient { } /// Adds a domain mask to an endpoint — a custom domain used to hide the - /// endpoint's QuickNode URL so requests can be routed through your own + /// endpoint's Quicknode URL so requests can be routed through your own /// domain. #[pyo3(signature = (id, domain_mask=None))] #[gen_stub(override_return_type(type_repr = "typing.Coroutine[typing.Any, typing.Any, None]"))] @@ -975,7 +975,7 @@ impl AdminApiClient { }) } - /// Returns all chains supported by QuickNode along with their networks. + /// Returns all chains supported by Quicknode along with their networks. /// Each entry includes the chain slug and its network slugs and names. #[gen_stub(override_return_type( type_repr = "typing.Coroutine[typing.Any, typing.Any, ListChainsResponse]" @@ -2274,7 +2274,7 @@ impl KvStoreApiClient { #[pymodule] fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { errors::add_to_module(m)?; - m.add_class::()?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/crates/ruby/src/errors.rs b/crates/ruby/src/errors.rs index ddd59b9..c455bdd 100644 --- a/crates/ruby/src/errors.rs +++ b/crates/ruby/src/errors.rs @@ -78,7 +78,7 @@ fn classes(ruby: &Ruby) -> &ErrorClasses { let _ = ruby; CLASSES .get() - .expect("QuickNodeSdk error classes not initialized") + .expect("QuicknodeSdk error classes not initialized") } #[allow(clippy::needless_pass_by_value)] diff --git a/crates/ruby/src/lib.rs b/crates/ruby/src/lib.rs index 73972a7..efc9fe7 100644 --- a/crates/ruby/src/lib.rs +++ b/crates/ruby/src/lib.rs @@ -220,16 +220,16 @@ fn hash_get_extra_destinations( } } -// ── QuickNodeSdk ──────────────────────────────────────────────────────────── +// ── QuicknodeSdk ──────────────────────────────────────────────────────────── -#[magnus::wrap(class = "QuickNodeSdk::SDK", free_immediately, size)] -pub struct QuickNodeSdk { - inner: core::QuickNodeSdk, +#[magnus::wrap(class = "QuicknodeSdk::SDK", free_immediately, size)] +pub struct QuicknodeSdk { + inner: core::QuicknodeSdk, } -impl QuickNodeSdk { +impl QuicknodeSdk { fn from_env() -> Result { - core::QuickNodeSdk::from_env() + core::QuicknodeSdk::from_env() .map(|inner| Self { inner }) .map_err(map_err) } @@ -263,7 +263,7 @@ impl QuickNodeSdk { // // All methods return JSON strings. Call JSON.parse on the result in Ruby. -#[magnus::wrap(class = "QuickNodeSdk::Admin", free_immediately, size)] +#[magnus::wrap(class = "QuicknodeSdk::Admin", free_immediately, size)] #[derive(Clone)] pub struct AdminApiClient { inner: core::admin::AdminApiClient, @@ -1037,7 +1037,7 @@ impl AdminApiClient { // ── DestinationAttributes ─────────────────────────────────────────────────── -#[magnus::wrap(class = "QuickNodeSdk::DestinationAttributes", free_immediately, size)] +#[magnus::wrap(class = "QuicknodeSdk::DestinationAttributes", free_immediately, size)] pub struct DestinationAttributes { pub inner: core::streams::DestinationAttributes, } @@ -1227,7 +1227,7 @@ impl DestinationAttributes { // ── StreamsApiClient ──────────────────────────────────────────────────────── -#[magnus::wrap(class = "QuickNodeSdk::Streams", free_immediately, size)] +#[magnus::wrap(class = "QuicknodeSdk::Streams", free_immediately, size)] #[derive(Clone)] pub struct StreamsApiClient { inner: core::streams::StreamsApiClient, @@ -1466,7 +1466,7 @@ impl StreamsApiClient { // ── WebhooksApiClient ─────────────────────────────────────────────────────── -#[magnus::wrap(class = "QuickNodeSdk::Webhooks", free_immediately, size)] +#[magnus::wrap(class = "QuicknodeSdk::Webhooks", free_immediately, size)] #[derive(Clone)] pub struct WebhooksApiClient { inner: core::webhooks::WebhooksApiClient, @@ -1636,7 +1636,7 @@ impl WebhooksApiClient { // ── KvStoreApiClient ──────────────────────────────────────────────────────── -#[magnus::wrap(class = "QuickNodeSdk::KvStore", free_immediately, size)] +#[magnus::wrap(class = "QuicknodeSdk::KvStore", free_immediately, size)] #[derive(Clone)] pub struct KvStoreApiClient { inner: core::kvstore::KvStoreApiClient, @@ -1798,7 +1798,7 @@ impl KvStoreApiClient { #[magnus::init(name = "quicknode_sdk")] fn init(ruby: &Ruby) -> Result<(), Error> { - let module = ruby.define_module("QuickNodeSdk")?; + let module = ruby.define_module("QuicknodeSdk")?; // Typed exception hierarchy — register before client classes so map_err // can use them from the first call onward. @@ -1806,11 +1806,11 @@ fn init(ruby: &Ruby) -> Result<(), Error> { // ── SDK root ────────────────────────────────────────────── let sdk = module.define_class("SDK", ruby.class_object())?; - sdk.define_singleton_method("from_env", function!(QuickNodeSdk::from_env, 0))?; - sdk.define_method("admin", method!(QuickNodeSdk::admin, 0))?; - sdk.define_method("streams", method!(QuickNodeSdk::streams, 0))?; - sdk.define_method("webhooks", method!(QuickNodeSdk::webhooks, 0))?; - sdk.define_method("kvstore", method!(QuickNodeSdk::kvstore, 0))?; + sdk.define_singleton_method("from_env", function!(QuicknodeSdk::from_env, 0))?; + sdk.define_method("admin", method!(QuicknodeSdk::admin, 0))?; + sdk.define_method("streams", method!(QuicknodeSdk::streams, 0))?; + sdk.define_method("webhooks", method!(QuicknodeSdk::webhooks, 0))?; + sdk.define_method("kvstore", method!(QuicknodeSdk::kvstore, 0))?; // ── Admin ───────────────────────────────────────────────── let admin = module.define_class("Admin", ruby.class_object())?; diff --git a/npm/errors.js b/npm/errors.js index 9fef90d..55cc32a 100644 --- a/npm/errors.js +++ b/npm/errors.js @@ -2,21 +2,21 @@ // message is tagged "[||]\x1f"; parseAndRethrow // decodes that and throws an instance of the matching subclass below. -class QuickNodeError extends Error { +class QuicknodeError extends Error { constructor(message) { super(message); - this.name = "QuickNodeError"; + this.name = "QuicknodeError"; } } -class ConfigError extends QuickNodeError { +class ConfigError extends QuicknodeError { constructor(message) { super(message); this.name = "ConfigError"; } } -class HttpError extends QuickNodeError { +class HttpError extends QuicknodeError { constructor(message) { super(message); this.name = "HttpError"; @@ -37,7 +37,7 @@ class ConnectionError extends HttpError { } } -class ApiError extends QuickNodeError { +class ApiError extends QuicknodeError { constructor(message, status, body) { super(message); this.name = "ApiError"; @@ -46,7 +46,7 @@ class ApiError extends QuickNodeError { } } -class DecodeError extends QuickNodeError { +class DecodeError extends QuicknodeError { constructor(message, body) { super(message); this.name = "DecodeError"; @@ -109,7 +109,7 @@ function wrapClient(client) { } module.exports = { - QuickNodeError, + QuicknodeError, ConfigError, HttpError, TimeoutError, diff --git a/npm/examples/admin.ts b/npm/examples/admin.ts index e21d3aa..405684b 100644 --- a/npm/examples/admin.ts +++ b/npm/examples/admin.ts @@ -1,12 +1,12 @@ import { - QuickNodeSdk, + QuicknodeSdk, ApiError, TimeoutError, - QuickNodeError, + QuicknodeError, } from "../sdk"; async function main() { - const qn = QuickNodeSdk.fromEnv(); + const qn = QuicknodeSdk.fromEnv(); const response = await qn.admin.getEndpoints({ limit: 20, @@ -40,13 +40,13 @@ async function main() { await qn.admin.showEndpoint("does-not-exist"); } catch (e) { if (!(e instanceof ApiError)) throw e; - console.assert(e instanceof QuickNodeError); + console.assert(e instanceof QuicknodeError); console.assert(e.status === 404); console.log(`api error ${e.status}: ${e.body.slice(0, 80)}`); } // 2) Timeout path — unreachable base URL + 1s timeout forces a timeout. - const blackhole = new QuickNodeSdk({ + const blackhole = new QuicknodeSdk({ apiKey: process.env.QN_SDK__API_KEY ?? "", http: { timeoutSecs: 1 }, admin: { baseUrl: "http://10.255.255.1/" }, diff --git a/npm/examples/kvstore_e2e.ts b/npm/examples/kvstore_e2e.ts index 21536ab..24a161d 100644 --- a/npm/examples/kvstore_e2e.ts +++ b/npm/examples/kvstore_e2e.ts @@ -1,4 +1,4 @@ -import { QuickNodeSdk } from "../sdk"; +import { QuicknodeSdk } from "../sdk"; import type { CreateSetParams, BulkSetsParams, @@ -8,7 +8,7 @@ import type { } from "../sdk"; async function main() { - const qn = QuickNodeSdk.fromEnv(); + const qn = QuicknodeSdk.fromEnv(); // ── Sets ────────────────────────────────────────────────────────────────── diff --git a/npm/examples/streams.ts b/npm/examples/streams.ts index 8ea0940..f923749 100644 --- a/npm/examples/streams.ts +++ b/npm/examples/streams.ts @@ -1,5 +1,5 @@ import { - QuickNodeSdk, + QuicknodeSdk, StreamDataset, StreamMetadataLocation, StreamRegion, @@ -8,7 +8,7 @@ import { import type { CreateStreamParams } from "../sdk"; async function main() { - const qn = QuickNodeSdk.fromEnv(); + const qn = QuicknodeSdk.fromEnv(); const params: CreateStreamParams = { name: "My Stream", network: "ethereum-mainnet", diff --git a/npm/examples/streams_e2e.ts b/npm/examples/streams_e2e.ts index 6125b6a..97f2733 100644 --- a/npm/examples/streams_e2e.ts +++ b/npm/examples/streams_e2e.ts @@ -1,5 +1,5 @@ import { - QuickNodeSdk, + QuicknodeSdk, StreamDataset, StreamMetadataLocation, StreamRegion, @@ -10,7 +10,7 @@ import type { CreateStreamParams, UpdateStreamParams } from "../sdk"; const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); async function main() { - const qn = QuickNodeSdk.fromEnv(); + const qn = QuicknodeSdk.fromEnv(); const before = await qn.streams.listStreams(); console.log(`streams before: ${before.pageInfo.total}`); diff --git a/npm/examples/webhooks_e2e.ts b/npm/examples/webhooks_e2e.ts index e190f2b..6d47c69 100644 --- a/npm/examples/webhooks_e2e.ts +++ b/npm/examples/webhooks_e2e.ts @@ -1,4 +1,4 @@ -import { QuickNodeSdk, TemplateArgs, WebhookStartFrom } from "../sdk"; +import { QuicknodeSdk, TemplateArgs, WebhookStartFrom } from "../sdk"; import type { CreateWebhookFromTemplateParams, UpdateWebhookParams, @@ -7,7 +7,7 @@ import type { const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); async function main() { - const qn = QuickNodeSdk.fromEnv(); + const qn = QuicknodeSdk.fromEnv(); const before = await qn.webhooks.listWebhooks(); console.log(`webhooks before: ${before.data.length}`); diff --git a/npm/index.d.ts b/npm/index.d.ts index 869e5b7..4f5d40d 100644 --- a/npm/index.d.ts +++ b/npm/index.d.ts @@ -172,7 +172,7 @@ export interface ChainNetwork { /** Numeric chain id, when applicable. */ chainId?: number } -/** A blockchain supported by QuickNode along with its networks. */ +/** A blockchain supported by Quicknode along with its networks. */ export interface Chain { /** Chain slug (e.g. `ethereum`). */ slug: string @@ -362,7 +362,7 @@ export interface CreateIpRequest { } /** Parameters for `create_domain_mask`. */ export interface CreateDomainMaskRequest { - /** Custom domain that will mask the endpoint's QuickNode URL. */ + /** Custom domain that will mask the endpoint's Quicknode URL. */ domainMask?: string } /** Parameters for `create_jwt`. */ @@ -469,7 +469,7 @@ export interface Pagination { export interface Endpoint { /** Unique endpoint identifier. */ id: string - /** QuickNode-assigned subdomain. */ + /** Quicknode-assigned subdomain. */ name: string /** Human-readable label. */ label?: string @@ -1830,7 +1830,7 @@ export interface ListStreamsResponseNode { data: Array pageInfo: PageInfo } -export declare class QuickNodeSdk { +export declare class QuicknodeSdk { /** Creates a new SDK instance from an explicit configuration. */ constructor(config: SdkFullConfig) /** Returns the admin sub-client. */ @@ -1842,7 +1842,7 @@ export declare class QuickNodeSdk { /** Returns the kvstore sub-client. */ get kvstore(): KvStoreApiClient /** Creates a new SDK instance using configuration from environment variables. */ - static fromEnv(): QuickNodeSdk + static fromEnv(): QuicknodeSdk } export declare class AdminApiClient { /** @@ -1949,7 +1949,7 @@ export declare class AdminApiClient { deleteIp(id: string, ipId: string): Promise /** * Adds a domain mask to an endpoint — a custom domain used to hide the - * endpoint's QuickNode URL so requests can be routed through your own + * endpoint's Quicknode URL so requests can be routed through your own * domain. */ createDomainMask(id: string, params?: CreateDomainMaskRequest | undefined | null): Promise @@ -2034,7 +2034,7 @@ export declare class AdminApiClient { */ getAccountMetrics(params: GetAccountMetricsRequest): Promise /** - * Returns all chains supported by QuickNode along with their networks. + * Returns all chains supported by Quicknode along with their networks. * Each entry includes the chain slug and its network slugs and names. */ listChains(): Promise diff --git a/npm/sdk.d.ts b/npm/sdk.d.ts index e0ed244..66a79e6 100644 --- a/npm/sdk.d.ts +++ b/npm/sdk.d.ts @@ -1,6 +1,6 @@ // sdk.d.ts import { - QuickNodeSdk as _QuickNodeSdk, + QuicknodeSdk as _QuicknodeSdk, SdkFullConfig, WebhookAttributes, S3Attributes, @@ -301,13 +301,13 @@ export interface StreamsApiClientTyped { getEnabledCount(streamType?: string | undefined | null): Promise; } -export class QuickNodeSdk { +export class QuicknodeSdk { constructor(config: SdkFullConfig); - static fromEnv(): QuickNodeSdk; - admin: _QuickNodeSdk["admin"]; + static fromEnv(): QuicknodeSdk; + admin: _QuicknodeSdk["admin"]; streams: StreamsApiClientTyped; - webhooks: _QuickNodeSdk["webhooks"]; - kvstore: _QuickNodeSdk["kvstore"]; + webhooks: _QuicknodeSdk["webhooks"]; + kvstore: _QuicknodeSdk["kvstore"]; } export class TemplateArgs { @@ -324,16 +324,16 @@ export class TemplateArgs { } // Typed error hierarchy. Any SDK call can throw one of these; catch -// QuickNodeError to handle them all, or a specific subclass for finer control. -export class QuickNodeError extends Error {} -export class ConfigError extends QuickNodeError {} -export class HttpError extends QuickNodeError {} +// QuicknodeError to handle them all, or a specific subclass for finer control. +export class QuicknodeError extends Error {} +export class ConfigError extends QuicknodeError {} +export class HttpError extends QuicknodeError {} export class TimeoutError extends HttpError {} export class ConnectionError extends HttpError {} -export class ApiError extends QuickNodeError { +export class ApiError extends QuicknodeError { status: number; body: string; } -export class DecodeError extends QuickNodeError { +export class DecodeError extends QuicknodeError { body: string; } diff --git a/npm/sdk.js b/npm/sdk.js index 0f42b47..71d9b48 100644 --- a/npm/sdk.js +++ b/npm/sdk.js @@ -1,13 +1,13 @@ // Exported main sdk file that imports from autogenerated napi-rs file // const _index = require("./index.js"); -const { QuickNodeSdk: _QuickNodeSdk } = _index; +const { QuicknodeSdk: _QuicknodeSdk } = _index; const errors = require("./errors.js"); -class QuickNodeSdk { +class QuicknodeSdk { constructor(config) { try { - this._inner = new _QuickNodeSdk(config); + this._inner = new _QuicknodeSdk(config); } catch (e) { throw errors.fromNapiError(e); } @@ -18,9 +18,9 @@ class QuickNodeSdk { } static fromEnv() { - const instance = Object.create(QuickNodeSdk.prototype); + const instance = Object.create(QuicknodeSdk.prototype); try { - instance._inner = _QuickNodeSdk.fromEnv(); + instance._inner = _QuicknodeSdk.fromEnv(); } catch (e) { throw errors.fromNapiError(e); } @@ -90,9 +90,9 @@ class TemplateArgs { module.exports = { ..._index, - QuickNodeSdk, + QuicknodeSdk, TemplateArgs, - QuickNodeError: errors.QuickNodeError, + QuicknodeError: errors.QuicknodeError, ConfigError: errors.ConfigError, HttpError: errors.HttpError, TimeoutError: errors.TimeoutError, diff --git a/npm/sdk.mjs b/npm/sdk.mjs index 1fa7f1e..c904b67 100644 --- a/npm/sdk.mjs +++ b/npm/sdk.mjs @@ -9,7 +9,7 @@ import cjs from './sdk.js'; export default cjs; export const { - QuickNodeSdk, + QuicknodeSdk, TemplateArgs, StreamRegion, StreamDataset, @@ -24,7 +24,7 @@ export const { StreamsApiClient, WebhooksApiClient, KvStoreApiClient, - QuickNodeError, + QuicknodeError, ConfigError, HttpError, TimeoutError, diff --git a/python/examples/admin.py b/python/examples/admin.py index 8fce9f9..bc83ace 100644 --- a/python/examples/admin.py +++ b/python/examples/admin.py @@ -1,18 +1,18 @@ import asyncio import os from sdk import ( - QuickNodeSdk, + QuicknodeSdk, SdkFullConfig, HttpConfig, AdminConfig, ApiError, TimeoutError, - QuickNodeError, + QuicknodeError, ) async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() response = await qn.admin.get_endpoints( limit=20, @@ -41,12 +41,12 @@ async def main(): try: await qn.admin.show_endpoint("does-not-exist") except ApiError as e: - assert isinstance(e, QuickNodeError) + assert isinstance(e, QuicknodeError) assert e.status == 404 print(f"api error {e.status}: {e.body[:80]}") # 2) Timeout path — unreachable base URL + 1s timeout forces a timeout. - blackhole = QuickNodeSdk( + blackhole = QuicknodeSdk( SdkFullConfig( api_key=os.environ["QN_SDK__API_KEY"], http=HttpConfig(timeout_secs=1), diff --git a/python/examples/kvstore_e2e.py b/python/examples/kvstore_e2e.py index da8f74f..c8532b0 100644 --- a/python/examples/kvstore_e2e.py +++ b/python/examples/kvstore_e2e.py @@ -1,9 +1,9 @@ import asyncio -from sdk import QuickNodeSdk +from sdk import QuicknodeSdk async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() # ── Sets ───────────────────────────────────────────────────────────────── diff --git a/python/examples/streams.py b/python/examples/streams.py index f4ba7e5..7ef1fd4 100644 --- a/python/examples/streams.py +++ b/python/examples/streams.py @@ -1,9 +1,9 @@ import asyncio -from sdk import QuickNodeSdk, WebhookAttributes, StreamWebhookDestination +from sdk import QuicknodeSdk, WebhookAttributes, StreamWebhookDestination async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() stream = await qn.streams.create_stream( name="My Stream", network="ethereum-mainnet", diff --git a/python/examples/streams_e2e.py b/python/examples/streams_e2e.py index 0019c96..053f00a 100644 --- a/python/examples/streams_e2e.py +++ b/python/examples/streams_e2e.py @@ -1,14 +1,14 @@ import asyncio import time from sdk import ( - QuickNodeSdk, + QuicknodeSdk, WebhookAttributes, StreamWebhookDestination, ) async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() before = await qn.streams.list_streams() print(f"streams before: {before.page_info.total}") diff --git a/python/examples/webhooks_e2e.py b/python/examples/webhooks_e2e.py index bed2253..131c14c 100644 --- a/python/examples/webhooks_e2e.py +++ b/python/examples/webhooks_e2e.py @@ -2,14 +2,14 @@ from sdk import ( EvmWalletFilterTemplate, - QuickNodeSdk, + QuicknodeSdk, TemplateArgs, WebhookDestinationAttributes, ) async def main(): - qn = QuickNodeSdk.from_env() + qn = QuicknodeSdk.from_env() before = await qn.webhooks.list_webhooks() print(f"webhooks before: {len(before.data)}") diff --git a/python/sdk/__init__.py b/python/sdk/__init__.py index 9686ae0..6a96a36 100644 --- a/python/sdk/__init__.py +++ b/python/sdk/__init__.py @@ -1,6 +1,6 @@ # Need to manually keep this file updated with the exports from sdk._core import ( - QuickNodeSdk, + QuicknodeSdk, AdminApiClient, StreamsApiClient, Stream, @@ -184,7 +184,7 @@ XrplWalletFilterTemplate, HyperliquidWalletEventsFilterTemplate, StellarWalletTransactionsFilterTemplate, - QuickNodeError, + QuicknodeError, ConfigError, HttpError, TimeoutError, @@ -194,7 +194,7 @@ ) __all__ = [ - "QuickNodeSdk", + "QuicknodeSdk", "AdminApiClient", "StreamsApiClient", "Stream", @@ -378,7 +378,7 @@ "XrplWalletFilterTemplate", "HyperliquidWalletEventsFilterTemplate", "StellarWalletTransactionsFilterTemplate", - "QuickNodeError", + "QuicknodeError", "ConfigError", "HttpError", "TimeoutError", diff --git a/python/sdk/__init__.pyi b/python/sdk/__init__.pyi index 01bbfeb..f1f25ec 100644 --- a/python/sdk/__init__.pyi +++ b/python/sdk/__init__.pyi @@ -2,7 +2,7 @@ ## python/sdk/__init__.pyi is a build artifact — overwritten by `just python-build`. ## Edit this file, not __init__.pyi directly. from sdk._core import ( - QuickNodeSdk, + QuicknodeSdk, AdminApiClient, StreamsApiClient, Stream, @@ -186,7 +186,7 @@ from sdk._core import ( XrplWalletFilterTemplate, HyperliquidWalletEventsFilterTemplate, StellarWalletTransactionsFilterTemplate, - QuickNodeError, + QuicknodeError, ConfigError, HttpError, TimeoutError, @@ -196,7 +196,7 @@ from sdk._core import ( ) __all__ = [ - "QuickNodeSdk", + "QuicknodeSdk", "AdminApiClient", "StreamsApiClient", "Stream", @@ -380,7 +380,7 @@ __all__ = [ "XrplWalletFilterTemplate", "HyperliquidWalletEventsFilterTemplate", "StellarWalletTransactionsFilterTemplate", - "QuickNodeError", + "QuicknodeError", "ConfigError", "HttpError", "TimeoutError", diff --git a/python/sdk/_core/__init__.pyi b/python/sdk/_core/__init__.pyi index 37a3a70..1defe12 100644 --- a/python/sdk/_core/__init__.pyi +++ b/python/sdk/_core/__init__.pyi @@ -125,7 +125,7 @@ __all__ = [ "Pagination", "Payment", "PostgresAttributes", - "QuickNodeSdk", + "QuicknodeSdk", "RateLimitSettings", "RedisAttributes", "RemoveTeamMemberRequest", @@ -386,7 +386,7 @@ class AdminApiClient: def create_domain_mask(self, id: builtins.str, domain_mask: typing.Optional[builtins.str] = None) -> typing.Coroutine[typing.Any, typing.Any, None]: r""" Adds a domain mask to an endpoint — a custom domain used to hide the - endpoint's QuickNode URL so requests can be routed through your own + endpoint's Quicknode URL so requests can be routed through your own domain. """ def delete_domain_mask(self, id: builtins.str, domain_mask_id: builtins.str) -> typing.Coroutine[typing.Any, typing.Any, DeleteBoolResponse]: @@ -479,7 +479,7 @@ class AdminApiClient: """ def list_chains(self) -> typing.Coroutine[typing.Any, typing.Any, ListChainsResponse]: r""" - Returns all chains supported by QuickNode along with their networks. + Returns all chains supported by Quicknode along with their networks. Each entry includes the chain slug and its network slugs and names. """ def list_invoices(self) -> typing.Coroutine[typing.Any, typing.Any, ListInvoicesResponse]: @@ -1056,7 +1056,7 @@ class BulkUpdateEndpointStatusResponse: @typing.final class Chain: r""" - A blockchain supported by QuickNode along with its networks. + A blockchain supported by Quicknode along with its networks. """ @property def slug(self) -> builtins.str: @@ -1316,12 +1316,12 @@ class CreateDomainMaskRequest: @property def domain_mask(self) -> typing.Optional[builtins.str]: r""" - Custom domain that will mask the endpoint's QuickNode URL. + Custom domain that will mask the endpoint's Quicknode URL. """ @domain_mask.setter def domain_mask(self, value: typing.Optional[builtins.str]) -> None: r""" - Custom domain that will mask the endpoint's QuickNode URL. + Custom domain that will mask the endpoint's Quicknode URL. """ @typing.final @@ -1854,12 +1854,12 @@ class Endpoint: @property def name(self) -> builtins.str: r""" - QuickNode-assigned subdomain. + Quicknode-assigned subdomain. """ @name.setter def name(self, value: builtins.str) -> None: r""" - QuickNode-assigned subdomain. + Quicknode-assigned subdomain. """ @property def label(self) -> typing.Optional[builtins.str]: @@ -4735,7 +4735,7 @@ class PostgresAttributes: def __new__(cls, host: builtins.str, port: builtins.int, database: builtins.str, username: builtins.str, password: builtins.str, table_name: builtins.str, sslmode: builtins.str, max_retry: builtins.int, retry_interval_sec: builtins.int) -> PostgresAttributes: ... @typing.final -class QuickNodeSdk: +class QuicknodeSdk: @property def admin(self) -> AdminApiClient: ... @property @@ -4744,12 +4744,12 @@ class QuickNodeSdk: def webhooks(self) -> WebhooksApiClient: ... @property def kvstore(self) -> KvStoreApiClient: ... - def __new__(cls, config: SdkFullConfig) -> QuickNodeSdk: + def __new__(cls, config: SdkFullConfig) -> QuicknodeSdk: r""" Creates a new SDK instance from an explicit configuration. """ @staticmethod - def from_env() -> QuickNodeSdk: + def from_env() -> QuicknodeSdk: r""" Creates a new SDK instance using configuration from environment variables. """ diff --git a/python/sdk/init_manual_override.pyi b/python/sdk/init_manual_override.pyi index 01bbfeb..f1f25ec 100644 --- a/python/sdk/init_manual_override.pyi +++ b/python/sdk/init_manual_override.pyi @@ -2,7 +2,7 @@ ## python/sdk/__init__.pyi is a build artifact — overwritten by `just python-build`. ## Edit this file, not __init__.pyi directly. from sdk._core import ( - QuickNodeSdk, + QuicknodeSdk, AdminApiClient, StreamsApiClient, Stream, @@ -186,7 +186,7 @@ from sdk._core import ( XrplWalletFilterTemplate, HyperliquidWalletEventsFilterTemplate, StellarWalletTransactionsFilterTemplate, - QuickNodeError, + QuicknodeError, ConfigError, HttpError, TimeoutError, @@ -196,7 +196,7 @@ from sdk._core import ( ) __all__ = [ - "QuickNodeSdk", + "QuicknodeSdk", "AdminApiClient", "StreamsApiClient", "Stream", @@ -380,7 +380,7 @@ __all__ = [ "XrplWalletFilterTemplate", "HyperliquidWalletEventsFilterTemplate", "StellarWalletTransactionsFilterTemplate", - "QuickNodeError", + "QuicknodeError", "ConfigError", "HttpError", "TimeoutError", diff --git a/ruby/examples/admin.rb b/ruby/examples/admin.rb index 8fd71cc..3889574 100644 --- a/ruby/examples/admin.rb +++ b/ruby/examples/admin.rb @@ -1,7 +1,7 @@ require "json" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env response = JSON.parse(qn.admin.get_endpoints( limit: 20, diff --git a/ruby/examples/admin_e2e.rb b/ruby/examples/admin_e2e.rb index be9c8be..66e33c4 100644 --- a/ruby/examples/admin_e2e.rb +++ b/ruby/examples/admin_e2e.rb @@ -2,7 +2,7 @@ require "securerandom" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env # ── Read-only globals ───────────────────────────────────────────────────────── @@ -324,8 +324,8 @@ begin qn.admin.show_endpoint(id: "does-not-exist") raise "expected 404" -rescue QuickNodeSdk::ApiError => e - raise "expected QuickNodeSdk::Error subclass" unless e.is_a?(QuickNodeSdk::Error) +rescue QuicknodeSdk::ApiError => e + raise "expected QuicknodeSdk::Error subclass" unless e.is_a?(QuicknodeSdk::Error) raise "expected 404, got #{e.status}" unless e.status == 404 puts "api error #{e.status}: #{e.body[0, 80]}" end @@ -336,11 +336,11 @@ ENV["QN_SDK__ADMIN__BASE_URL"] = "http://10.255.255.1/" ENV["QN_SDK__HTTP__TIMEOUT_SECS"] = "1" begin - blackhole = QuickNodeSdk::SDK.from_env + blackhole = QuicknodeSdk::SDK.from_env begin blackhole.admin.get_endpoints(limit: 20) raise "expected timeout" - rescue QuickNodeSdk::TimeoutError + rescue QuicknodeSdk::TimeoutError puts "timed out as expected" end ensure diff --git a/ruby/examples/kvstore_e2e.rb b/ruby/examples/kvstore_e2e.rb index 141debd..8a179f0 100644 --- a/ruby/examples/kvstore_e2e.rb +++ b/ruby/examples/kvstore_e2e.rb @@ -1,7 +1,7 @@ require "json" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env # ── Sets ────────────────────────────────────────────────────────────────── diff --git a/ruby/examples/streams.rb b/ruby/examples/streams.rb index e896b0e..1648271 100644 --- a/ruby/examples/streams.rb +++ b/ruby/examples/streams.rb @@ -1,9 +1,9 @@ require "json" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env -dest = QuickNodeSdk::DestinationAttributes.webhook( +dest = QuicknodeSdk::DestinationAttributes.webhook( url: "https://webhook.site/ae19071a-2dcc-4035-9cdf-406dcb4719ef", max_retry: 3, retry_interval_sec: 1, diff --git a/ruby/examples/streams_e2e.rb b/ruby/examples/streams_e2e.rb index 0e67d94..46f424b 100644 --- a/ruby/examples/streams_e2e.rb +++ b/ruby/examples/streams_e2e.rb @@ -1,7 +1,7 @@ require "json" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env before = JSON.parse(qn.streams.list_streams({})) puts "streams before: #{before["pageInfo"]["total"]}" @@ -18,7 +18,7 @@ puts "filter logs: #{filter_result["logs"]}" sleep 1 -dest = QuickNodeSdk::DestinationAttributes.webhook( +dest = QuicknodeSdk::DestinationAttributes.webhook( url: "https://webhook.site/ae19071a-2dcc-4035-9cdf-406dcb4719ef", max_retry: 3, retry_interval_sec: 1, @@ -26,7 +26,7 @@ compression: "none" ) -extra_dest = QuickNodeSdk::DestinationAttributes.webhook( +extra_dest = QuicknodeSdk::DestinationAttributes.webhook( url: "https://webhook.site/ae19071a-2dcc-4035-9cdf-406dcb4719ef", max_retry: 3, retry_interval_sec: 1, diff --git a/ruby/examples/webhooks_e2e.rb b/ruby/examples/webhooks_e2e.rb index e4a7e8a..4c366e0 100644 --- a/ruby/examples/webhooks_e2e.rb +++ b/ruby/examples/webhooks_e2e.rb @@ -1,7 +1,7 @@ require "json" require_relative "../lib/quicknode_sdk" -qn = QuickNodeSdk::SDK.from_env +qn = QuicknodeSdk::SDK.from_env before = JSON.parse(qn.webhooks.list_webhooks({})) puts "webhooks before: #{before["data"].length}" diff --git a/ruby/quicknode_sdk.gemspec b/ruby/quicknode_sdk.gemspec index 526d0a5..77d2b54 100644 --- a/ruby/quicknode_sdk.gemspec +++ b/ruby/quicknode_sdk.gemspec @@ -1,8 +1,8 @@ Gem::Specification.new do |s| s.name = "quicknode_sdk" s.version = "0.1.0" - s.summary = "QuickNode SDK for Ruby" - s.authors = ["QuickNode"] + s.summary = "Quicknode SDK for Ruby" + s.authors = ["Quicknode"] s.license = "MIT" s.files = ["lib/quicknode_sdk.rb"] s.required_ruby_version = ">= 3.0"