@@ -4,6 +4,7 @@ use crate::{
4
4
body:: { boxed, BoxBody } ,
5
5
transport:: { BoxFuture , Endpoint } ,
6
6
} ;
7
+
7
8
use http:: Uri ;
8
9
use hyper:: rt;
9
10
use hyper:: { client:: conn:: http2:: Builder , rt:: Executor } ;
@@ -16,11 +17,19 @@ use tower::load::Load;
16
17
use tower:: {
17
18
layer:: Layer ,
18
19
limit:: { concurrency:: ConcurrencyLimitLayer , rate:: RateLimitLayer } ,
19
- util :: BoxService ,
20
- ServiceBuilder , ServiceExt ,
20
+ ServiceBuilder ,
21
+ ServiceExt , util :: BoxService ,
21
22
} ;
23
+ use tower:: load:: Load ;
22
24
use tower_service:: Service ;
23
25
26
+ use crate :: {
27
+ body:: BoxBody ,
28
+ transport:: { BoxFuture , Endpoint } ,
29
+ } ;
30
+
31
+ use super :: { AddOrigin , grpc_timeout:: GrpcTimeout , reconnect:: Reconnect , UserAgent } ;
32
+
24
33
pub ( crate ) type Response < B = BoxBody > = http:: Response < B > ;
25
34
pub ( crate ) type Request < B = BoxBody > = http:: Request < B > ;
26
35
@@ -43,18 +52,36 @@ impl Connection {
43
52
. timer ( TokioTimer :: new ( ) )
44
53
. clone ( ) ;
45
54
46
- if let Some ( val) = endpoint. http2_keep_alive_timeout {
47
- settings. keep_alive_timeout ( val) ;
55
+ if let Some ( val) = endpoint. http2_adaptive_window {
56
+ settings. http2_adaptive_window ( val) ;
48
57
}
49
58
50
- if let Some ( val) = endpoint. http2_keep_alive_while_idle {
51
- settings. keep_alive_while_idle ( val) ;
59
+ #[ cfg( feature = "transport" ) ]
60
+ {
61
+ settings
62
+ . http_keep_alive_interval ( endpoint. http2_keep_alive_interval ) ;
63
+
64
+ if let Some ( val) = endpoint. http2_keep_alive_timeout {
65
+ settings. keep_alive_timeout ( val) ;
66
+ }
67
+
68
+ if let Some ( val) = endpoint. http2_keep_alive_while_idle {
69
+ settings. keep_alive_while_idle ( val) ;
70
+ }
52
71
}
53
72
54
73
if let Some ( val) = endpoint. http2_adaptive_window {
55
74
settings. adaptive_window ( val) ;
56
75
}
57
76
77
+
78
+ #[ cfg( target_arch = "wasm32" ) ]
79
+ {
80
+ settings. executor ( wasm:: Executor )
81
+ // reset streams require `Instant::now` which is not available on wasm
82
+ . http_max_concurrent_reset_streams ( 0 ) ;
83
+ }
84
+
58
85
let stack = ServiceBuilder :: new ( )
59
86
. layer_fn ( |s| {
60
87
let origin = endpoint. origin . as_ref ( ) . unwrap_or ( & endpoint. uri ) . clone ( ) ;
@@ -209,3 +236,19 @@ where
209
236
} )
210
237
}
211
238
}
239
+
240
+ #[ cfg( target_arch = "wasm32" ) ]
241
+ mod wasm {
242
+ use std:: future:: Future ;
243
+ use std:: pin:: Pin ;
244
+
245
+ type BoxSendFuture = Pin < Box < dyn Future < Output = ( ) > + Send > > ;
246
+
247
+ pub ( crate ) struct Executor ;
248
+
249
+ impl hyper:: rt:: Executor < BoxSendFuture > for Executor {
250
+ fn execute ( & self , fut : BoxSendFuture ) {
251
+ wasm_bindgen_futures:: spawn_local ( fut)
252
+ }
253
+ }
254
+ }
0 commit comments