@@ -2,6 +2,7 @@ use graph::{
22 anyhow:: Error ,
33 blockchain:: BlockchainKind ,
44 components:: network_provider:: ChainName ,
5+ endpoint:: Compression ,
56 env:: ENV_VARS ,
67 firehose:: { SubgraphLimit , SUBGRAPHS_PER_CONN } ,
78 itertools:: Itertools ,
@@ -516,6 +517,7 @@ impl ChainSection {
516517 features,
517518 headers : Default :: default ( ) ,
518519 rules : vec ! [ ] ,
520+ compression : Compression :: None ,
519521 } ) ,
520522 } ;
521523 let entry = chains. entry ( name. to_string ( ) ) . or_insert_with ( || Chain {
@@ -694,6 +696,10 @@ pub struct Web3Provider {
694696
695697 #[ serde( default , rename = "match" ) ]
696698 rules : Vec < Web3Rule > ,
699+
700+ /// Compression method for RPC requests and responses
701+ #[ serde( default ) ]
702+ pub compression : Compression ,
697703}
698704
699705impl Web3Provider {
@@ -891,6 +897,7 @@ impl<'de> Deserialize<'de> for Provider {
891897 . ok_or_else ( || serde:: de:: Error :: missing_field ( "features" ) ) ?,
892898 headers : headers. unwrap_or_else ( HeaderMap :: new) ,
893899 rules : nodes,
900+ compression : Compression :: None ,
894901 } ) ,
895902 } ;
896903
@@ -1203,6 +1210,7 @@ mod tests {
12031210 Chain , Config , FirehoseProvider , Provider , ProviderDetails , Shard , Transport , Web3Provider ,
12041211 } ;
12051212 use graph:: blockchain:: BlockchainKind ;
1213+ use graph:: endpoint:: Compression ;
12061214 use graph:: firehose:: SubgraphLimit ;
12071215 use graph:: http:: { HeaderMap , HeaderValue } ;
12081216 use graph:: prelude:: regex:: Regex ;
@@ -1291,6 +1299,7 @@ mod tests {
12911299 features: BTreeSet :: new( ) ,
12921300 headers: HeaderMap :: new( ) ,
12931301 rules: Vec :: new( ) ,
1302+ compression: Compression :: None ,
12941303 } ) ,
12951304 } ,
12961305 actual
@@ -1317,6 +1326,7 @@ mod tests {
13171326 features: BTreeSet :: new( ) ,
13181327 headers: HeaderMap :: new( ) ,
13191328 rules: Vec :: new( ) ,
1329+ compression: Compression :: None ,
13201330 } ) ,
13211331 } ,
13221332 actual
@@ -1378,6 +1388,7 @@ mod tests {
13781388 features,
13791389 headers,
13801390 rules: Vec :: new( ) ,
1391+ compression: Compression :: None ,
13811392 } ) ,
13821393 } ,
13831394 actual
@@ -1403,6 +1414,7 @@ mod tests {
14031414 features: BTreeSet :: new( ) ,
14041415 headers: HeaderMap :: new( ) ,
14051416 rules: Vec :: new( ) ,
1417+ compression: Compression :: None ,
14061418 } ) ,
14071419 } ,
14081420 actual
@@ -1613,6 +1625,7 @@ mod tests {
16131625 features: BTreeSet :: new( ) ,
16141626 headers: HeaderMap :: new( ) ,
16151627 rules: Vec :: new( ) ,
1628+ compression: Compression :: None ,
16161629 } ) ,
16171630 } ,
16181631 actual
@@ -1625,6 +1638,66 @@ mod tests {
16251638 assert ! ( SubgraphLimit :: Limit ( 10 ) > SubgraphLimit :: Disabled ) ;
16261639 }
16271640
1641+ #[ test]
1642+ fn it_parses_web3_provider_with_compression ( ) {
1643+ let actual = toml:: from_str (
1644+ r#"
1645+ label = "compressed"
1646+ details = { type = "web3", url = "http://localhost:8545", features = ["archive"], compression = "gzip" }
1647+ "# ,
1648+ )
1649+ . unwrap ( ) ;
1650+
1651+ assert_eq ! (
1652+ Provider {
1653+ label: "compressed" . to_owned( ) ,
1654+ details: ProviderDetails :: Web3 ( Web3Provider {
1655+ transport: Transport :: Rpc ,
1656+ url: "http://localhost:8545" . to_owned( ) ,
1657+ features: {
1658+ let mut features = BTreeSet :: new( ) ;
1659+ features. insert( "archive" . to_string( ) ) ;
1660+ features
1661+ } ,
1662+ headers: HeaderMap :: new( ) ,
1663+ rules: Vec :: new( ) ,
1664+ compression: Compression :: Gzip ,
1665+ } ) ,
1666+ } ,
1667+ actual
1668+ ) ;
1669+ }
1670+
1671+ #[ test]
1672+ fn it_parses_web3_provider_with_no_compression ( ) {
1673+ let actual = toml:: from_str (
1674+ r#"
1675+ label = "uncompressed"
1676+ details = { type = "web3", url = "http://localhost:8545", features = ["archive"], compression = "none" }
1677+ "# ,
1678+ )
1679+ . unwrap ( ) ;
1680+
1681+ assert_eq ! (
1682+ Provider {
1683+ label: "uncompressed" . to_owned( ) ,
1684+ details: ProviderDetails :: Web3 ( Web3Provider {
1685+ transport: Transport :: Rpc ,
1686+ url: "http://localhost:8545" . to_owned( ) ,
1687+ features: {
1688+ let mut features = BTreeSet :: new( ) ;
1689+ features. insert( "archive" . to_string( ) ) ;
1690+ features
1691+ } ,
1692+ headers: HeaderMap :: new( ) ,
1693+ rules: Vec :: new( ) ,
1694+ compression: Compression :: None ,
1695+ } ) ,
1696+ } ,
1697+ actual
1698+ ) ;
1699+ }
1700+
16281701 #[ test]
16291702 fn duplicated_labels_are_not_allowed_within_chain ( ) {
16301703 let mut actual = toml:: from_str :: < ChainSection > (
0 commit comments