Skip to content

Commit a2bdd0a

Browse files
neekolasclaude
andcommitted
feat: update static methods to accept Backend instead of raw host params
Replace v3_host/gateway_host/is_secure parameters with &Backend on all static API functions in Node and WASM bindings. Internally uses MessageBackendBuilder::from_bundle() to create API clients from the pre-built ClientBundle inside Backend. Affected functions: - Node: get_inbox_id_by_identity, is_installation_authorized, is_address_authorized, revoke_installations_signature_request, apply_signature_request, fetch_inbox_states_by_inbox_ids - WASM: get_inbox_id_for_identifier, revoke_installations_signature_request, apply_signature_request, inbox_state_from_inbox_ids Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e548bed commit a2bdd0a

File tree

9 files changed

+53
-1917
lines changed

9 files changed

+53
-1917
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,6 @@ om.json
189189
/.build
190190
/.swiftpm
191191
**/.direnv/**
192+
193+
# Superpowers
194+
docs/plans

bindings/node/src/inbox_id.rs

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,23 @@
11
use crate::ErrorWrapper;
2+
use crate::client::backend::Backend;
23
use crate::identity::Identifier;
34
use napi::bindgen_prelude::{BigInt, Error, Result, Uint8Array};
45
use napi_derive::napi;
5-
use std::sync::Arc;
66
use xmtp_api::{ApiClientWrapper, strategies};
77
use xmtp_api_d14n::MessageBackendBuilder;
8-
use xmtp_api_d14n::TrackedStatsClient;
98
use xmtp_id::associations::Identifier as XmtpIdentifier;
109
use xmtp_id::associations::MemberIdentifier;
1110
use xmtp_proto::types::ApiIdentifier;
1211

1312
#[napi]
1413
pub async fn get_inbox_id_by_identity(
15-
v3_host: String,
16-
gateway_host: Option<String>,
17-
is_secure: bool,
14+
backend: &Backend,
1815
identifier: Identifier,
1916
) -> Result<Option<String>> {
20-
let backend = MessageBackendBuilder::default()
21-
.v3_host(&v3_host)
22-
.maybe_gateway_host(gateway_host)
23-
.is_secure(is_secure)
24-
.build()
17+
let api_client = MessageBackendBuilder::default()
18+
.from_bundle(backend.bundle.clone())
2519
.map_err(ErrorWrapper::from)?;
26-
let backend = TrackedStatsClient::new(backend);
27-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
20+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
2821

2922
let identifier: xmtp_id::associations::Identifier = identifier.try_into()?;
3023
let api_ident: ApiIdentifier = identifier.into();
@@ -57,14 +50,12 @@ pub fn generate_inbox_id(account_ident: Identifier, nonce: Option<BigInt>) -> Re
5750

5851
#[napi]
5952
pub async fn is_installation_authorized(
60-
host: String,
61-
gateway_host: Option<String>,
53+
backend: &Backend,
6254
inbox_id: String,
6355
installation_id: Uint8Array,
6456
) -> Result<bool> {
6557
is_member_of_association_state(
66-
&host,
67-
gateway_host,
58+
backend,
6859
&inbox_id,
6960
&MemberIdentifier::installation(installation_id.to_vec()),
7061
)
@@ -73,35 +64,27 @@ pub async fn is_installation_authorized(
7364

7465
#[napi]
7566
pub async fn is_address_authorized(
76-
host: String,
77-
gateway_host: Option<String>,
67+
backend: &Backend,
7868
inbox_id: String,
7969
address: String,
8070
) -> Result<bool> {
8171
is_member_of_association_state(
82-
&host,
83-
gateway_host,
72+
backend,
8473
&inbox_id,
8574
&MemberIdentifier::eth(address).map_err(ErrorWrapper::from)?,
8675
)
8776
.await
8877
}
8978

9079
async fn is_member_of_association_state(
91-
v3_host: &str,
92-
gateway_host: Option<String>,
80+
backend: &Backend,
9381
inbox_id: &str,
9482
identifier: &MemberIdentifier,
9583
) -> Result<bool> {
96-
let backend = MessageBackendBuilder::default()
97-
.maybe_gateway_host(gateway_host)
98-
.v3_host(v3_host)
99-
.is_secure(true)
100-
.build()
84+
let api_client = MessageBackendBuilder::default()
85+
.from_bundle(backend.bundle.clone())
10186
.map_err(ErrorWrapper::from)?;
102-
let backend = TrackedStatsClient::new(backend);
103-
104-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
87+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
10588

10689
let is_member =
10790
xmtp_mls::identity_updates::is_member_of_association_state(&api, inbox_id, identifier, None)

bindings/node/src/inbox_state.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
use crate::client::backend::Backend;
12
use crate::{ErrorWrapper, identity::Identifier};
23
use napi::bindgen_prelude::{BigInt, Result, Uint8Array};
34
use napi_derive::napi;
45
use std::sync::Arc;
56
use xmtp_api::ApiClientWrapper;
67
use xmtp_api::strategies;
78
use xmtp_api_d14n::MessageBackendBuilder;
8-
use xmtp_api_d14n::TrackedStatsClient;
99
use xmtp_db::EncryptedMessageStore;
1010
use xmtp_db::NativeDb;
1111
use xmtp_id::associations::{AssociationState, MemberIdentifier, ident};
@@ -85,19 +85,13 @@ impl From<VerifiedKeyPackageV2> for KeyPackageStatus {
8585
#[allow(dead_code)]
8686
#[napi]
8787
pub async fn fetch_inbox_states_by_inbox_ids(
88-
v3_host: String,
89-
gateway_host: Option<String>,
88+
backend: &Backend,
9089
inbox_ids: Vec<String>,
9190
) -> Result<Vec<InboxState>> {
92-
let backend = MessageBackendBuilder::default()
93-
.v3_host(&v3_host)
94-
.maybe_gateway_host(gateway_host)
95-
.is_secure(true)
96-
.build()
91+
let api_client = MessageBackendBuilder::default()
92+
.from_bundle(backend.bundle.clone())
9793
.map_err(ErrorWrapper::from)?;
98-
let backend = TrackedStatsClient::new(backend);
99-
100-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
94+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
10195
let scw_verifier = Arc::new(Box::new(api.clone()) as Box<dyn SmartContractSignatureVerifier>);
10296

10397
let db = NativeDb::builder()

bindings/node/src/signatures.rs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use crate::ErrorWrapper;
2+
use crate::client::backend::Backend;
23
use crate::identity::{Identifier, IdentifierKind};
34
use napi::bindgen_prelude::{BigInt, Error, Result, Uint8Array};
45
use napi_derive::napi;
56
use std::ops::Deref;
67
use std::sync::Arc;
78
use xmtp_api::{ApiClientWrapper, strategies};
8-
use xmtp_api_d14n::{MessageBackendBuilder, TrackedStatsClient};
9+
use xmtp_api_d14n::MessageBackendBuilder;
910
use xmtp_id::associations::builder::SignatureRequest;
1011
use xmtp_id::associations::{
1112
AccountId,
@@ -47,21 +48,15 @@ pub fn verify_signed_with_public_key(
4748
#[allow(dead_code)]
4849
#[napi]
4950
pub async fn revoke_installations_signature_request(
50-
v3_host: String,
51-
gateway_host: Option<String>,
51+
backend: &Backend,
5252
recovery_identifier: Identifier,
5353
inbox_id: String,
5454
installation_ids: Vec<Uint8Array>,
5555
) -> Result<SignatureRequestHandle> {
56-
let backend = MessageBackendBuilder::default()
57-
.v3_host(&v3_host)
58-
.maybe_gateway_host(gateway_host)
59-
.is_secure(true)
60-
.build()
56+
let api_client = MessageBackendBuilder::default()
57+
.from_bundle(backend.bundle.clone())
6158
.map_err(ErrorWrapper::from)?;
62-
let backend = TrackedStatsClient::new(backend);
63-
64-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
59+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
6560
let scw_verifier = Arc::new(Box::new(api.clone()) as Box<dyn SmartContractSignatureVerifier>);
6661

6762
let ident = recovery_identifier.try_into()?;
@@ -79,19 +74,13 @@ pub async fn revoke_installations_signature_request(
7974
#[allow(dead_code)]
8075
#[napi]
8176
pub async fn apply_signature_request(
82-
v3_host: String,
83-
gateway_host: Option<String>,
77+
backend: &Backend,
8478
signature_request: &SignatureRequestHandle,
8579
) -> Result<()> {
86-
let backend = MessageBackendBuilder::default()
87-
.maybe_gateway_host(gateway_host)
88-
.v3_host(&v3_host)
89-
.is_secure(true)
90-
.build()
80+
let api_client = MessageBackendBuilder::default()
81+
.from_bundle(backend.bundle.clone())
9182
.map_err(ErrorWrapper::from)?;
92-
let backend = TrackedStatsClient::new(backend);
93-
94-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
83+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
9584
let scw_verifier = Arc::new(Box::new(api.clone()) as Box<dyn SmartContractSignatureVerifier>);
9685

9786
let inner = signature_request.inner.lock().await;

bindings/wasm/src/inbox_id.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,25 @@
11
use crate::ErrorWrapper;
2+
use crate::client::backend::Backend;
23
use crate::identity::Identifier;
34
use wasm_bindgen::{JsError, prelude::wasm_bindgen};
45
use xmtp_api::{ApiClientWrapper, strategies};
5-
use xmtp_api_d14n::{MessageBackendBuilder, TrackedStatsClient};
6+
use xmtp_api_d14n::MessageBackendBuilder;
67
use xmtp_id::associations::Identifier as XmtpIdentifier;
78
use xmtp_proto::types::ApiIdentifier;
89

910
#[wasm_bindgen(js_name = getInboxIdForIdentifier)]
1011
pub async fn get_inbox_id_for_identifier(
11-
#[wasm_bindgen(js_name = host)] v3_host: String,
12-
#[wasm_bindgen(js_name = gatewayHost)] gateway_host: Option<String>,
13-
#[wasm_bindgen(js_name = isSecure)] is_secure: bool,
12+
backend: &Backend,
1413
#[wasm_bindgen(js_name = accountIdentifier)] account_identifier: Identifier,
1514
) -> Result<Option<String>, JsError> {
16-
let backend = MessageBackendBuilder::default()
17-
.v3_host(&v3_host)
18-
.maybe_gateway_host(gateway_host)
19-
.is_secure(is_secure)
20-
.build()
15+
let api_client = MessageBackendBuilder::default()
16+
.from_bundle(backend.bundle.clone())
2117
.map_err(ErrorWrapper::js)?;
22-
let api_client = ApiClientWrapper::new(
23-
TrackedStatsClient::new(backend),
24-
strategies::exponential_cooldown(),
25-
);
18+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
2619

2720
let ident: XmtpIdentifier = account_identifier.clone().try_into()?;
2821
let api_ident: ApiIdentifier = ident.into();
29-
let results = api_client
22+
let results = api
3023
.get_inbox_ids(vec![api_ident.clone()])
3124
.await
3225
.map_err(ErrorWrapper::js)?;

bindings/wasm/src/inbox_state.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::ErrorWrapper;
2+
use crate::client::backend::Backend;
23
use crate::{client::Client, identity::Identifier};
34
use serde::{Deserialize, Serialize};
45
use std::collections::HashMap;
@@ -7,7 +8,6 @@ use tsify::Tsify;
78
use wasm_bindgen::{JsError, JsValue, prelude::wasm_bindgen};
89
use xmtp_api::{ApiClientWrapper, strategies};
910
use xmtp_api_d14n::MessageBackendBuilder;
10-
use xmtp_api_d14n::TrackedStatsClient;
1111
use xmtp_db::{EncryptedMessageStore, StorageOption, WasmDb};
1212
use xmtp_id::associations::{AssociationState, MemberIdentifier, ident};
1313
use xmtp_id::scw_verifier::SmartContractSignatureVerifier;
@@ -100,18 +100,13 @@ impl From<VerifiedKeyPackageV2> for KeyPackageStatus {
100100

101101
#[wasm_bindgen(js_name = inboxStateFromInboxIds)]
102102
pub async fn inbox_state_from_inbox_ids(
103-
#[wasm_bindgen(js_name = host)] v3_host: String,
104-
#[wasm_bindgen(js_name = gatewayHost)] gateway_host: Option<String>,
103+
backend: &Backend,
105104
#[wasm_bindgen(js_name = inboxIds)] inbox_ids: Vec<String>,
106105
) -> Result<Vec<InboxState>, JsError> {
107-
let backend = MessageBackendBuilder::default()
108-
.v3_host(&v3_host)
109-
.maybe_gateway_host(gateway_host)
110-
.is_secure(true)
111-
.build()
106+
let api_client = MessageBackendBuilder::default()
107+
.from_bundle(backend.bundle.clone())
112108
.map_err(ErrorWrapper::js)?;
113-
let backend = TrackedStatsClient::new(backend);
114-
let api = ApiClientWrapper::new(backend, strategies::exponential_cooldown());
109+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
115110
let scw_verifier = Arc::new(Box::new(api.clone()) as Box<dyn SmartContractSignatureVerifier>);
116111

117112
let db = WasmDb::new(&StorageOption::Ephemeral).await?;

bindings/wasm/src/signatures.rs

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::ErrorWrapper;
2+
use crate::client::backend::Backend;
23
use crate::{
34
client::Client,
45
identity::{Identifier, IdentifierKind},
@@ -10,7 +11,7 @@ use std::sync::Arc;
1011
use tsify::Tsify;
1112
use wasm_bindgen::prelude::{JsError, wasm_bindgen};
1213
use xmtp_api::{ApiClientWrapper, strategies};
13-
use xmtp_api_d14n::{MessageBackendBuilder, TrackedStatsClient};
14+
use xmtp_api_d14n::MessageBackendBuilder;
1415
use xmtp_id::associations::builder::SignatureRequest;
1516
use xmtp_id::associations::{
1617
AccountId,
@@ -49,20 +50,15 @@ pub fn verify_signed_with_public_key(
4950

5051
#[wasm_bindgen(js_name = revokeInstallationsSignatureRequest)]
5152
pub fn revoke_installations_signature_request(
52-
#[wasm_bindgen(js_name = host)] v3_host: String,
53-
#[wasm_bindgen(js_name = gatewayHost)] gateway_host: Option<String>,
53+
backend: &Backend,
5454
#[wasm_bindgen(js_name = recoveryIdentifier)] recovery_identifier: Identifier,
5555
#[wasm_bindgen(js_name = inboxId)] inbox_id: String,
5656
#[wasm_bindgen(js_name = installationIds)] installation_ids: Vec<Uint8Array>,
5757
) -> Result<SignatureRequestHandle, JsError> {
58-
let backend = MessageBackendBuilder::default()
59-
.v3_host(&v3_host)
60-
.maybe_gateway_host(gateway_host)
61-
.is_secure(true)
62-
.build()
58+
let api_client = MessageBackendBuilder::default()
59+
.from_bundle(backend.bundle.clone())
6360
.map_err(ErrorWrapper::js)?;
64-
let backend = TrackedStatsClient::new(backend);
65-
let api = ApiClientWrapper::new(Arc::new(backend), strategies::exponential_cooldown());
61+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
6662
let scw_verifier = Arc::new(Box::new(api.clone()) as Box<dyn SmartContractSignatureVerifier>);
6763

6864
let ident = recovery_identifier.try_into()?;
@@ -79,22 +75,13 @@ pub fn revoke_installations_signature_request(
7975

8076
#[wasm_bindgen(js_name = applySignatureRequest)]
8177
pub async fn apply_signature_request(
82-
#[wasm_bindgen(js_name = host)] v3_host: String,
83-
#[wasm_bindgen(js_name = gatewayHost)] gateway_host: Option<String>,
78+
backend: &Backend,
8479
#[wasm_bindgen(js_name = signatureRequest)] signature_request: &SignatureRequestHandle,
8580
) -> Result<(), JsError> {
86-
let backend = MessageBackendBuilder::default()
87-
.v3_host(&v3_host)
88-
.maybe_gateway_host(gateway_host)
89-
.is_secure(true)
90-
.build()
81+
let api_client = MessageBackendBuilder::default()
82+
.from_bundle(backend.bundle.clone())
9183
.map_err(ErrorWrapper::js)?;
92-
let backend = TrackedStatsClient::new(backend);
93-
94-
let api = ApiClientWrapper::new(
95-
TrackedStatsClient::new(backend),
96-
strategies::exponential_cooldown(),
97-
);
84+
let api = ApiClientWrapper::new(api_client, strategies::exponential_cooldown());
9885
let scw_verifier = Arc::new(api.clone());
9986

10087
let inner = signature_request.inner.lock().await;

0 commit comments

Comments
 (0)