Skip to content

Commit 54d9cbb

Browse files
Add wasm32-unknown-unknown and wasm32-wasip2 build support (#1434)
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
1 parent 909e753 commit 54d9cbb

File tree

138 files changed

+5891
-4014
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+5891
-4014
lines changed

.generator/src/generator/templates/api.j2

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -97,41 +97,50 @@ impl {{ structName }} {
9797
Self::default()
9898
}
9999
pub fn with_config(config: datadog::Configuration) -> Self {
100-
let mut reqwest_client_builder = reqwest::Client::builder();
101-
102-
if let Some(proxy_url) = &config.proxy_url {
103-
let proxy = reqwest::Proxy::all(proxy_url)
104-
.expect("Failed to parse proxy URL");
105-
reqwest_client_builder = reqwest_client_builder.proxy(proxy);
106-
}
100+
let reqwest_client_builder = {
101+
let builder = reqwest::Client::builder();
102+
#[cfg(not(target_arch = "wasm32"))]
103+
let builder = if let Some(proxy_url) = &config.proxy_url {
104+
builder
105+
.proxy(reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL"))
106+
} else {
107+
builder
108+
};
109+
builder
110+
};
107111

108-
let mut middleware_client_builder =
109-
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
110-
111-
if config.enable_retry {
112-
struct RetryableStatus;
113-
impl reqwest_retry::RetryableStrategy for RetryableStatus {
114-
fn handle(
115-
&self,
116-
res: &Result<reqwest::Response, reqwest_middleware::Error>,
117-
) -> Option<reqwest_retry::Retryable> {
118-
match res {
119-
Ok(success) => reqwest_retry::default_on_request_success(success),
120-
Err(_) => None,
112+
let middleware_client_builder = {
113+
let builder =
114+
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
115+
#[cfg(feature = "retry")]
116+
let builder = if config.enable_retry {
117+
struct RetryableStatus;
118+
impl reqwest_retry::RetryableStrategy for RetryableStatus {
119+
fn handle(
120+
&self,
121+
res: &Result<reqwest::Response, reqwest_middleware::Error>,
122+
) -> Option<reqwest_retry::Retryable> {
123+
match res {
124+
Ok(success) => reqwest_retry::default_on_request_success(success),
125+
Err(_) => None,
126+
}
121127
}
122128
}
123-
}
124-
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
125-
.build_with_max_retries(config.max_retries);
129+
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
130+
.build_with_max_retries(config.max_retries);
126131

127-
let retry_middleware =
128-
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
129-
backoff_policy,
130-
RetryableStatus,
131-
);
132+
let retry_middleware =
133+
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
134+
backoff_policy,
135+
RetryableStatus,
136+
);
132137

133-
middleware_client_builder = middleware_client_builder.with(retry_middleware);
134-
}
138+
builder.with(retry_middleware)
139+
} else {
140+
builder
141+
};
142+
builder
143+
};
135144

136145
let client = middleware_client_builder.build();
137146

@@ -478,6 +487,7 @@ impl {{ structName }} {
478487
Err(e) => return Err(datadog::Error::Io(e)),
479488
}
480489
}
490+
#[cfg(feature = "zstd")]
481491
"zstd1" => {
482492
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
483493
let _ = enc.write_all(ser.into_inner().as_slice());

Cargo.toml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,22 @@ version = "0.28.0"
3232
[dependencies]
3333
async-stream = "0.3.5"
3434
chrono = {version = "0.4.31", features = ["serde"] }
35+
# Activates JS crypto API for getrandom on wasm32-unknown-unknown (browser); harmless on other targets
36+
getrandom = { version = "0.2", features = ["js"] }
3537
flate2 = "1.0.28"
3638
form-data-builder = "1.0.1"
3739
futures-core = "0.3.30"
3840
lazy_static = "1.4.0"
3941
log = "0.4.20"
4042
reqwest = { version = "0.11.24", features = ["multipart"], default-features = false }
4143
reqwest-middleware = "0.2.5"
42-
reqwest-retry = "0.3.0"
44+
reqwest-retry = { version = "0.3.0", optional = true }
4345
serde = { version = "1.0.197", features = ["derive"] }
4446
serde_json = "1.0.114"
4547
serde_with = "3.6.1"
4648
url = "2.5.0"
47-
uuid = { version = "1.8.0", features = ["v4", "fast-rng", "macro-diagnostics", "serde"] }
48-
zstd = "0.13.0"
49+
uuid = { version = "1.8.0", features = ["v4", "fast-rng", "macro-diagnostics", "serde", "js"] }
50+
zstd = { version = "0.13.0", optional = true }
4951

5052
[build-dependencies]
5153
rustc_version = "0.4.0"
@@ -78,6 +80,15 @@ name="v1_authentication_Validate"
7880
cargo-args = ["-Zunstable-options", "-Zrustdoc-scrape-examples"]
7981

8082
[features]
81-
default = ["native-tls"]
83+
default = ["native-tls", "zstd", "retry"]
8284
native-tls = ["reqwest/native-tls"]
8385
rustls-tls = ["reqwest/rustls-tls-webpki-roots"]
86+
# Enable zstd request body compression (requires C toolchain; not available for wasm targets)
87+
zstd = ["dep:zstd"]
88+
# Enable automatic request retry with exponential backoff (requires tokio; not available for wasm32-unknown-unknown)
89+
retry = ["dep:reqwest-retry"]
90+
# Convenience feature for wasm32-unknown-unknown (browser) targets:
91+
# disables zstd (C FFI) and retry (tokio::time); uuid/js provides entropy via JS crypto API
92+
# Usage: --no-default-features --features wasm
93+
# For wasm32-wasip2: --no-default-features --features rustls-tls,retry
94+
wasm = []

src/datadogV1/api/api_authentication.rs

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,40 +39,50 @@ impl AuthenticationAPI {
3939
Self::default()
4040
}
4141
pub fn with_config(config: datadog::Configuration) -> Self {
42-
let mut reqwest_client_builder = reqwest::Client::builder();
43-
44-
if let Some(proxy_url) = &config.proxy_url {
45-
let proxy = reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL");
46-
reqwest_client_builder = reqwest_client_builder.proxy(proxy);
47-
}
42+
let reqwest_client_builder = {
43+
let builder = reqwest::Client::builder();
44+
#[cfg(not(target_arch = "wasm32"))]
45+
let builder = if let Some(proxy_url) = &config.proxy_url {
46+
builder
47+
.proxy(reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL"))
48+
} else {
49+
builder
50+
};
51+
builder
52+
};
4853

49-
let mut middleware_client_builder =
50-
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
51-
52-
if config.enable_retry {
53-
struct RetryableStatus;
54-
impl reqwest_retry::RetryableStrategy for RetryableStatus {
55-
fn handle(
56-
&self,
57-
res: &Result<reqwest::Response, reqwest_middleware::Error>,
58-
) -> Option<reqwest_retry::Retryable> {
59-
match res {
60-
Ok(success) => reqwest_retry::default_on_request_success(success),
61-
Err(_) => None,
54+
let middleware_client_builder = {
55+
let builder =
56+
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
57+
#[cfg(feature = "retry")]
58+
let builder = if config.enable_retry {
59+
struct RetryableStatus;
60+
impl reqwest_retry::RetryableStrategy for RetryableStatus {
61+
fn handle(
62+
&self,
63+
res: &Result<reqwest::Response, reqwest_middleware::Error>,
64+
) -> Option<reqwest_retry::Retryable> {
65+
match res {
66+
Ok(success) => reqwest_retry::default_on_request_success(success),
67+
Err(_) => None,
68+
}
6269
}
6370
}
64-
}
65-
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
66-
.build_with_max_retries(config.max_retries);
67-
68-
let retry_middleware =
69-
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
70-
backoff_policy,
71-
RetryableStatus,
72-
);
73-
74-
middleware_client_builder = middleware_client_builder.with(retry_middleware);
75-
}
71+
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
72+
.build_with_max_retries(config.max_retries);
73+
74+
let retry_middleware =
75+
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
76+
backoff_policy,
77+
RetryableStatus,
78+
);
79+
80+
builder.with(retry_middleware)
81+
} else {
82+
builder
83+
};
84+
builder
85+
};
7686

7787
let client = middleware_client_builder.build();
7888

src/datadogV1/api/api_aws_integration.rs

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -189,40 +189,50 @@ impl AWSIntegrationAPI {
189189
Self::default()
190190
}
191191
pub fn with_config(config: datadog::Configuration) -> Self {
192-
let mut reqwest_client_builder = reqwest::Client::builder();
193-
194-
if let Some(proxy_url) = &config.proxy_url {
195-
let proxy = reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL");
196-
reqwest_client_builder = reqwest_client_builder.proxy(proxy);
197-
}
192+
let reqwest_client_builder = {
193+
let builder = reqwest::Client::builder();
194+
#[cfg(not(target_arch = "wasm32"))]
195+
let builder = if let Some(proxy_url) = &config.proxy_url {
196+
builder
197+
.proxy(reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL"))
198+
} else {
199+
builder
200+
};
201+
builder
202+
};
198203

199-
let mut middleware_client_builder =
200-
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
201-
202-
if config.enable_retry {
203-
struct RetryableStatus;
204-
impl reqwest_retry::RetryableStrategy for RetryableStatus {
205-
fn handle(
206-
&self,
207-
res: &Result<reqwest::Response, reqwest_middleware::Error>,
208-
) -> Option<reqwest_retry::Retryable> {
209-
match res {
210-
Ok(success) => reqwest_retry::default_on_request_success(success),
211-
Err(_) => None,
204+
let middleware_client_builder = {
205+
let builder =
206+
reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
207+
#[cfg(feature = "retry")]
208+
let builder = if config.enable_retry {
209+
struct RetryableStatus;
210+
impl reqwest_retry::RetryableStrategy for RetryableStatus {
211+
fn handle(
212+
&self,
213+
res: &Result<reqwest::Response, reqwest_middleware::Error>,
214+
) -> Option<reqwest_retry::Retryable> {
215+
match res {
216+
Ok(success) => reqwest_retry::default_on_request_success(success),
217+
Err(_) => None,
218+
}
212219
}
213220
}
214-
}
215-
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
216-
.build_with_max_retries(config.max_retries);
221+
let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
222+
.build_with_max_retries(config.max_retries);
217223

218-
let retry_middleware =
219-
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
220-
backoff_policy,
221-
RetryableStatus,
222-
);
224+
let retry_middleware =
225+
reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
226+
backoff_policy,
227+
RetryableStatus,
228+
);
223229

224-
middleware_client_builder = middleware_client_builder.with(retry_middleware);
225-
}
230+
builder.with(retry_middleware)
231+
} else {
232+
builder
233+
};
234+
builder
235+
};
226236

227237
let client = middleware_client_builder.build();
228238

@@ -343,6 +353,7 @@ impl AWSIntegrationAPI {
343353
Err(e) => return Err(datadog::Error::Io(e)),
344354
}
345355
}
356+
#[cfg(feature = "zstd")]
346357
"zstd1" => {
347358
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
348359
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -500,6 +511,7 @@ impl AWSIntegrationAPI {
500511
Err(e) => return Err(datadog::Error::Io(e)),
501512
}
502513
}
514+
#[cfg(feature = "zstd")]
503515
"zstd1" => {
504516
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
505517
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -654,6 +666,7 @@ impl AWSIntegrationAPI {
654666
Err(e) => return Err(datadog::Error::Io(e)),
655667
}
656668
}
669+
#[cfg(feature = "zstd")]
657670
"zstd1" => {
658671
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
659672
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -808,6 +821,7 @@ impl AWSIntegrationAPI {
808821
Err(e) => return Err(datadog::Error::Io(e)),
809822
}
810823
}
824+
#[cfg(feature = "zstd")]
811825
"zstd1" => {
812826
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
813827
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -962,6 +976,7 @@ impl AWSIntegrationAPI {
962976
Err(e) => return Err(datadog::Error::Io(e)),
963977
}
964978
}
979+
#[cfg(feature = "zstd")]
965980
"zstd1" => {
966981
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
967982
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -1119,6 +1134,7 @@ impl AWSIntegrationAPI {
11191134
Err(e) => return Err(datadog::Error::Io(e)),
11201135
}
11211136
}
1137+
#[cfg(feature = "zstd")]
11221138
"zstd1" => {
11231139
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
11241140
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -1273,6 +1289,7 @@ impl AWSIntegrationAPI {
12731289
Err(e) => return Err(datadog::Error::Io(e)),
12741290
}
12751291
}
1292+
#[cfg(feature = "zstd")]
12761293
"zstd1" => {
12771294
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
12781295
let _ = enc.write_all(ser.into_inner().as_slice());
@@ -1888,6 +1905,7 @@ impl AWSIntegrationAPI {
18881905
Err(e) => return Err(datadog::Error::Io(e)),
18891906
}
18901907
}
1908+
#[cfg(feature = "zstd")]
18911909
"zstd1" => {
18921910
let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
18931911
let _ = enc.write_all(ser.into_inner().as_slice());

0 commit comments

Comments
 (0)