11use crate :: registry_logger:: Logger ;
22use anyhow:: { anyhow, Result } ;
3+ use hive_console_sdk:: supergraph_fetcher:: SupergraphFetcher ;
34use sha2:: Digest ;
45use sha2:: Sha256 ;
56use std:: env;
67use std:: io:: Write ;
78use std:: thread;
89
9- #[ derive( Debug , Clone ) ]
10+ #[ derive( Debug ) ]
1011pub struct HiveRegistry {
11- endpoint : String ,
12- key : String ,
1312 file_name : String ,
14- etag : Option < String > ,
15- accept_invalid_certs : bool ,
13+ fetcher : SupergraphFetcher ,
1614 pub logger : Logger ,
1715}
1816
@@ -24,8 +22,6 @@ pub struct HiveRegistryConfig {
2422 schema_file_path : Option < String > ,
2523}
2624
27- static COMMIT : Option < & ' static str > = option_env ! ( "GITHUB_SHA" ) ;
28-
2925impl HiveRegistry {
3026 #[ allow( clippy:: new_ret_no_self) ]
3127 pub fn new ( user_config : Option < HiveRegistryConfig > ) -> Result < ( ) > {
@@ -133,11 +129,9 @@ impl HiveRegistry {
133129 env:: set_var ( "APOLLO_ROUTER_HOT_RELOAD" , "true" ) ;
134130
135131 let mut registry = HiveRegistry {
136- endpoint,
137- key ,
132+ fetcher : SupergraphFetcher :: try_new ( endpoint, key , accept_invalid_certs )
133+ . map_err ( |e| anyhow ! ( e ) ) ? ,
138134 file_name,
139- etag : None ,
140- accept_invalid_certs,
141135 logger,
142136 } ;
143137
@@ -161,52 +155,9 @@ impl HiveRegistry {
161155 Ok ( ( ) )
162156 }
163157
164- fn fetch_supergraph ( & mut self , etag : Option < String > ) -> Result < Option < String > , String > {
165- let client = reqwest:: blocking:: Client :: builder ( )
166- . danger_accept_invalid_certs ( self . accept_invalid_certs )
167- . build ( )
168- . map_err ( |err| err. to_string ( ) ) ?;
169- let mut headers = reqwest:: header:: HeaderMap :: new ( ) ;
170-
171- headers. insert (
172- reqwest:: header:: USER_AGENT ,
173- reqwest:: header:: HeaderValue :: from_str (
174- format ! ( "hive-apollo-router/{}" , COMMIT . unwrap_or( "local" ) ) . as_str ( ) ,
175- )
176- . unwrap ( ) ,
177- ) ;
178- headers. insert ( "X-Hive-CDN-Key" , self . key . parse ( ) . unwrap ( ) ) ;
179-
180- if let Some ( checksum) = etag {
181- headers. insert ( "If-None-Match" , checksum. parse ( ) . unwrap ( ) ) ;
182- }
183-
184- let resp = client
185- . get ( self . endpoint . as_str ( ) )
186- . headers ( headers)
187- . send ( )
188- . map_err ( |e| e. to_string ( ) ) ?;
189-
190- match resp. headers ( ) . get ( "etag" ) {
191- Some ( checksum) => {
192- let etag = checksum. to_str ( ) . map_err ( |e| e. to_string ( ) ) ?;
193- self . update_latest_etag ( Some ( etag. to_string ( ) ) ) ;
194- }
195- None => {
196- self . update_latest_etag ( None ) ;
197- }
198- }
199-
200- if resp. status ( ) . as_u16 ( ) == 304 {
201- return Ok ( None ) ;
202- }
203-
204- Ok ( Some ( resp. text ( ) . map_err ( |e| e. to_string ( ) ) ?) )
205- }
206-
207158 fn initial_supergraph ( & mut self ) -> Result < ( ) , String > {
208159 let mut file = std:: fs:: File :: create ( self . file_name . clone ( ) ) . map_err ( |e| e. to_string ( ) ) ?;
209- let resp = self . fetch_supergraph ( None ) ?;
160+ let resp = self . fetcher . fetch_supergraph ( ) ?;
210161
211162 match resp {
212163 Some ( supergraph) => {
@@ -221,12 +172,8 @@ impl HiveRegistry {
221172 Ok ( ( ) )
222173 }
223174
224- fn update_latest_etag ( & mut self , etag : Option < String > ) {
225- self . etag = etag;
226- }
227-
228175 fn poll ( & mut self ) {
229- match self . fetch_supergraph ( self . etag . clone ( ) ) {
176+ match self . fetcher . fetch_supergraph ( ) {
230177 Ok ( new_supergraph) => {
231178 if let Some ( new_supergraph) = new_supergraph {
232179 let current_file = std:: fs:: read_to_string ( self . file_name . clone ( ) )
0 commit comments