From 03fa6089f37269d2101fb8108b6a42a3486db40c Mon Sep 17 00:00:00 2001 From: Gautam Gupta Date: Fri, 30 Aug 2024 13:23:06 -0700 Subject: [PATCH] host resolution refactor GitOrigin-RevId: 67669bd8b46688a1f5172a74ff07480d7b332b1a --- crates/application/src/api.rs | 62 +++++++++++----------- crates/common/src/http/mod.rs | 22 ++++---- crates/local_backend/src/authentication.rs | 4 +- crates/local_backend/src/http_actions.rs | 8 +-- crates/local_backend/src/public_api.rs | 20 +++---- crates/local_backend/src/storage.rs | 6 +-- crates/local_backend/src/subs/mod.rs | 10 ++-- crates/sync/src/tests.rs | 4 +- crates/sync/src/worker.rs | 6 +-- 9 files changed, 71 insertions(+), 71 deletions(-) diff --git a/crates/application/src/api.rs b/crates/application/src/api.rs index c6207012..ad4dd64b 100644 --- a/crates/application/src/api.rs +++ b/crates/application/src/api.rs @@ -12,7 +12,7 @@ use common::{ ExportPath, PublicFunctionPath, }, - http::ResolvedHost, + http::ResolvedHostname, pause::PauseClient, runtime::Runtime, types::{ @@ -93,7 +93,7 @@ pub enum ExecuteQueryTimestamp { pub trait ApplicationApi: Send + Sync { async fn authenticate( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, auth_token: AuthenticationToken, ) -> anyhow::Result; @@ -103,7 +103,7 @@ pub trait ApplicationApi: Send + Sync { /// for queries. async fn execute_public_query( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -118,7 +118,7 @@ pub trait ApplicationApi: Send + Sync { /// for admin or system identity. async fn execute_admin_query( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -131,7 +131,7 @@ pub trait ApplicationApi: Send + Sync { /// Execute a public mutation on the root app. async fn execute_public_mutation( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -144,7 +144,7 @@ pub trait ApplicationApi: Send + Sync { /// Execute an admin mutation for a particular component for the dashboard. async fn execute_admin_mutation( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -156,7 +156,7 @@ pub trait ApplicationApi: Send + Sync { /// Execute a public action on the root app. async fn execute_public_action( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -167,7 +167,7 @@ pub trait ApplicationApi: Send + Sync { /// Execute an admin action for a particular component for the dashboard. async fn execute_admin_action( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -178,7 +178,7 @@ pub trait ApplicationApi: Send + Sync { /// Execute an HTTP action on the root app. async fn execute_http_action( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, http_request_metadata: HttpActionRequest, identity: Identity, @@ -191,7 +191,7 @@ pub trait ApplicationApi: Send + Sync { /// calling functions outside the root component. async fn execute_any_function( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -201,13 +201,13 @@ pub trait ApplicationApi: Send + Sync { async fn latest_timestamp( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, ) -> anyhow::Result; async fn check_store_file_authorization( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, token: &str, validity: Duration, @@ -215,7 +215,7 @@ pub trait ApplicationApi: Send + Sync { async fn store_file( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, origin: ConvexOrigin, component: ComponentId, @@ -227,7 +227,7 @@ pub trait ApplicationApi: Send + Sync { async fn get_file_range( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, origin: ConvexOrigin, component: ComponentId, @@ -237,7 +237,7 @@ pub trait ApplicationApi: Send + Sync { async fn get_file( &self, - host: &ResolvedHost, + host: &ResolvedHostname, request_id: RequestId, origin: ConvexOrigin, component: ComponentId, @@ -253,7 +253,7 @@ pub trait ApplicationApi: Send + Sync { // start this way. async fn subscription_client( &self, - host: &ResolvedHost, + host: &ResolvedHostname, ) -> anyhow::Result>; } @@ -262,7 +262,7 @@ pub trait ApplicationApi: Send + Sync { impl ApplicationApi for Application { async fn authenticate( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, auth_token: AuthenticationToken, ) -> anyhow::Result { @@ -272,7 +272,7 @@ impl ApplicationApi for Application { async fn execute_public_query( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -303,7 +303,7 @@ impl ApplicationApi for Application { async fn execute_admin_query( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -334,7 +334,7 @@ impl ApplicationApi for Application { async fn execute_public_mutation( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -361,7 +361,7 @@ impl ApplicationApi for Application { async fn execute_admin_mutation( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -387,7 +387,7 @@ impl ApplicationApi for Application { async fn execute_public_action( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: ExportPath, @@ -410,7 +410,7 @@ impl ApplicationApi for Application { async fn execute_admin_action( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -433,7 +433,7 @@ impl ApplicationApi for Application { async fn execute_any_function( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, identity: Identity, path: CanonicalizedComponentFunctionPath, @@ -449,7 +449,7 @@ impl ApplicationApi for Application { async fn latest_timestamp( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, ) -> anyhow::Result { Ok(self.now_ts_for_reads()) @@ -457,7 +457,7 @@ impl ApplicationApi for Application { async fn execute_http_action( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, request_id: RequestId, http_request_metadata: HttpActionRequest, identity: Identity, @@ -476,7 +476,7 @@ impl ApplicationApi for Application { async fn check_store_file_authorization( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, token: &str, validity: Duration, @@ -487,7 +487,7 @@ impl ApplicationApi for Application { async fn store_file( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, _origin: ConvexOrigin, component: ComponentId, @@ -508,7 +508,7 @@ impl ApplicationApi for Application { async fn get_file_range( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, _origin: ConvexOrigin, component: ComponentId, @@ -520,7 +520,7 @@ impl ApplicationApi for Application { async fn get_file( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, _request_id: RequestId, _origin: ConvexOrigin, component: ComponentId, @@ -531,7 +531,7 @@ impl ApplicationApi for Application { async fn subscription_client( &self, - _host: &ResolvedHost, + _host: &ResolvedHostname, ) -> anyhow::Result> { Ok(Box::new(ApplicationSubscriptionClient { database: self.database.clone(), diff --git a/crates/common/src/http/mod.rs b/crates/common/src/http/mod.rs index 545c0370..344f2792 100644 --- a/crates/common/src/http/mod.rs +++ b/crates/common/src/http/mod.rs @@ -782,7 +782,7 @@ pub async fn stats_middleware( State(route_metric_mapper): State, matched_path: Option, ExtractRequestId(request_id): ExtractRequestId, - ExtractResolvedHost(resolved_host): ExtractResolvedHost, + ExtractResolvedHostname(resolved_host): ExtractResolvedHostname, ExtractClientVersion(client_version): ExtractClientVersion, req: http::request::Request, next: axum::middleware::Next, @@ -839,7 +839,7 @@ pub enum RequestDestination { } #[derive(Debug, Clone, Eq, PartialEq)] -pub struct ResolvedHost { +pub struct ResolvedHostname { pub instance_name: String, pub destination: RequestDestination, } @@ -851,7 +851,7 @@ pub static CONVEX_DOMAIN_REGEX: LazyLock = LazyLock::new(|| { .unwrap() }); -pub fn resolve_convex_domain(uri: &Uri) -> anyhow::Result> { +pub fn resolve_convex_domain(uri: &Uri) -> anyhow::Result> { let host = uri.host().context("URI does not have valid host")?; if let Some(captures) = CONVEX_DOMAIN_REGEX.captures(host) { let instance_name = captures[CONVEX_DOMAIN_REGEX_INSTANCE_CAPTURE].to_string(); @@ -860,7 +860,7 @@ pub fn resolve_convex_domain(uri: &Uri) -> anyhow::Result> "site" => RequestDestination::ConvexSite, _ => unreachable!("Regex capture only matches cloud or site"), }; - return Ok(Some(ResolvedHost { + return Ok(Some(ResolvedHostname { instance_name, destination, })); @@ -868,13 +868,13 @@ pub fn resolve_convex_domain(uri: &Uri) -> anyhow::Result> Ok(None) } -pub struct ExtractResolvedHost(pub ResolvedHost); +pub struct ExtractResolvedHostname(pub ResolvedHostname); #[derive(Clone, Debug)] pub struct OriginalHttpUri(pub Uri); #[async_trait] -impl FromRequestParts for ExtractResolvedHost { +impl FromRequestParts for ExtractResolvedHostname { type Rejection = Infallible; async fn from_request_parts( @@ -886,9 +886,9 @@ impl FromRequestParts for ExtractResolvedHost { // extraction to be fallible and optional. #[allow(clippy::disallowed_types)] if let Ok(axum::Extension(resolved)) = - parts.extract::>().await + parts.extract::>().await { - return Ok(ExtractResolvedHost(resolved)); + return Ok(ExtractResolvedHostname(resolved)); } // Try to parse the Host header as a URI and then resolve it as a Convex domain let host = parts.extract::().await.map_err(anyhow::Error::from); @@ -896,12 +896,12 @@ impl FromRequestParts for ExtractResolvedHost { .and_then(|Host(host)| Uri::try_from(host).map_err(anyhow::Error::from)) .and_then(|uri| resolve_convex_domain(&uri)) { - return Ok(ExtractResolvedHost(resolved)); + return Ok(ExtractResolvedHostname(resolved)); } // No luck -- fall back to `CONVEX_SITE` and assume `convex.cloud` as this is // likely a request to localhost. - Ok(ExtractResolvedHost(ResolvedHost { + Ok(ExtractResolvedHostname(ResolvedHostname { instance_name: ::std::env::var("CONVEX_SITE").unwrap_or_default(), destination: RequestDestination::ConvexCloud, })) @@ -1023,7 +1023,7 @@ where async fn log_middleware( remote_addr: Option>, - ExtractResolvedHost(resolved_host): ExtractResolvedHost, + ExtractResolvedHostname(resolved_host): ExtractResolvedHostname, req: axum::extract::Request, next: axum::middleware::Next, ) -> Result { diff --git a/crates/local_backend/src/authentication.rs b/crates/local_backend/src/authentication.rs index 33e16de3..c7327173 100644 --- a/crates/local_backend/src/authentication.rs +++ b/crates/local_backend/src/authentication.rs @@ -15,7 +15,7 @@ use common::{ http::{ extract::Query, ExtractRequestId, - ExtractResolvedHost, + ExtractResolvedHostname, HttpResponseError, }, runtime::Runtime, @@ -142,7 +142,7 @@ impl FromRequestParts for TryExtractIdentity { Err(e) => return Ok(Self(Err(e.into()))), }; - let Ok(ExtractResolvedHost(host)) = parts.extract::().await; + let Ok(ExtractResolvedHostname(host)) = parts.extract::().await; let request_id = match parts.extract::().await { Ok(id) => id, diff --git a/crates/local_backend/src/http_actions.rs b/crates/local_backend/src/http_actions.rs index 6a137f6c..e6a1daa8 100644 --- a/crates/local_backend/src/http_actions.rs +++ b/crates/local_backend/src/http_actions.rs @@ -27,10 +27,10 @@ use axum::{ use common::{ http::{ ExtractRequestId, - ExtractResolvedHost, + ExtractResolvedHostname, HttpResponseError, OriginalHttpUri, - ResolvedHost, + ResolvedHostname, }, types::FunctionCaller, RequestId, @@ -153,7 +153,7 @@ pub async fn http_any_method( State(st): State, TryExtractIdentity(identity_result): TryExtractIdentity, ExtractRequestId(request_id): ExtractRequestId, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractHttpRequestMetadata(http_request_metadata): ExtractHttpRequestMetadata, ) -> Result { let mut http_response_stream = stream_http_response( @@ -184,7 +184,7 @@ pub async fn http_any_method( #[try_stream(ok=HttpActionResponsePart, error=anyhow::Error, boxed)] async fn stream_http_response( - host: ResolvedHost, + host: ResolvedHostname, request_id: RequestId, http_request_metadata: HttpActionRequest, identity_result: anyhow::Result, diff --git a/crates/local_backend/src/public_api.rs b/crates/local_backend/src/public_api.rs index 58909d29..94a6a07b 100644 --- a/crates/local_backend/src/public_api.rs +++ b/crates/local_backend/src/public_api.rs @@ -22,7 +22,7 @@ use common::{ }, ExtractClientVersion, ExtractRequestId, - ExtractResolvedHost, + ExtractResolvedHostname, HttpResponseError, }, types::FunctionCaller, @@ -183,7 +183,7 @@ impl UdfResponse { /// Executes an arbitrary query/mutation/action from its name. pub async fn public_function_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -242,7 +242,7 @@ pub struct UdfPostRequestArgsOnly { /// request and doesn't require admin auth. pub async fn public_function_post_with_path( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, Path(path): Path, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, @@ -329,7 +329,7 @@ pub fn export_value( pub async fn public_query_get( State(st): State, Query(req): Query, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -373,7 +373,7 @@ pub async fn public_query_get( #[minitrace::trace(properties = { "udf_type": "query"})] pub async fn public_query_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -416,7 +416,7 @@ pub async fn public_query_post( } pub async fn public_get_query_ts( - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, State(st): State, ) -> Result { @@ -427,7 +427,7 @@ pub async fn public_get_query_ts( #[minitrace::trace(properties = { "udf_type": "query"})] pub async fn public_query_at_ts_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -482,7 +482,7 @@ pub struct QueryBatchResponse { pub async fn public_query_batch_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -531,7 +531,7 @@ pub async fn public_query_batch_post( #[minitrace::trace(properties = { "udf_type": "mutation"})] pub async fn public_mutation_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, @@ -577,7 +577,7 @@ pub async fn public_mutation_post( #[minitrace::trace(properties = { "udf_type": "action"})] pub async fn public_action_post( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractRequestId(request_id): ExtractRequestId, ExtractAuthenticationToken(auth_token): ExtractAuthenticationToken, ExtractClientVersion(client_version): ExtractClientVersion, diff --git a/crates/local_backend/src/storage.rs b/crates/local_backend/src/storage.rs index 12a32cb6..348e29a8 100644 --- a/crates/local_backend/src/storage.rs +++ b/crates/local_backend/src/storage.rs @@ -40,7 +40,7 @@ use common::{ Query, }, ExtractRequestId, - ExtractResolvedHost, + ExtractResolvedHostname, HttpResponseError, }, sha256::DigestHeader, @@ -90,7 +90,7 @@ pub async fn storage_upload( content_type: Result, TypedHeaderRejection>, content_length: Result, TypedHeaderRejection>, sha256: Result, TypedHeaderRejection>, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, Host(original_host): Host, ExtractRequestId(request_id): ExtractRequestId, body: Body, @@ -147,7 +147,7 @@ pub async fn storage_get( Path(uuid): Path, Query(GetQueryParams { component }): Query, range: Result, TypedHeaderRejection>, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, Host(original_host): Host, ExtractRequestId(request_id): ExtractRequestId, ) -> Result { diff --git a/crates/local_backend/src/subs/mod.rs b/crates/local_backend/src/subs/mod.rs index 25816101..92cc4693 100644 --- a/crates/local_backend/src/subs/mod.rs +++ b/crates/local_backend/src/subs/mod.rs @@ -27,9 +27,9 @@ use common::{ }, http::{ ExtractClientVersion, - ExtractResolvedHost, + ExtractResolvedHostname, HttpResponseError, - ResolvedHost, + ResolvedHostname, }, runtime::Runtime, version::{ @@ -131,7 +131,7 @@ impl Drop for DebugSyncSocketDropToken { // gracefully close the socket. async fn run_sync_socket( st: RouterState, - host: ResolvedHost, + host: ResolvedHostname, config: SyncWorkerConfig, socket: WebSocket, sentry_scope: sentry::Scope, @@ -351,7 +351,7 @@ fn new_sync_worker_config(client_version: ClientVersion) -> anyhow::Result, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractClientVersion(client_version): ExtractClientVersion, ws: WebSocketUpgrade, ) -> Result { @@ -369,7 +369,7 @@ pub async fn sync_client_version_url( pub async fn sync( State(st): State, - ExtractResolvedHost(host): ExtractResolvedHost, + ExtractResolvedHostname(host): ExtractResolvedHostname, ExtractClientVersion(client_version): ExtractClientVersion, ws: WebSocketUpgrade, ) -> Result { diff --git a/crates/sync/src/tests.rs b/crates/sync/src/tests.rs index a14ecbfd..90a97786 100644 --- a/crates/sync/src/tests.rs +++ b/crates/sync/src/tests.rs @@ -17,7 +17,7 @@ use common::{ }, http::{ RequestDestination, - ResolvedHost, + ResolvedHostname, }, runtime::{ shutdown_and_join, @@ -150,7 +150,7 @@ impl SyncTest { if let Err(e) = SyncWorker::new( api, rt, - ResolvedHost { + ResolvedHostname { instance_name: String::new(), destination: RequestDestination::ConvexCloud, }, diff --git a/crates/sync/src/worker.rs b/crates/sync/src/worker.rs index 71a60e71..d8b6e41d 100644 --- a/crates/sync/src/worker.rs +++ b/crates/sync/src/worker.rs @@ -33,7 +33,7 @@ use common::{ ComponentPath, ExportPath, }, - http::ResolvedHost, + http::ResolvedHostname, knobs::SYNC_MAX_SEND_TRANSITION_COUNT, minitrace_helpers::get_sampled_span, runtime::{ @@ -204,7 +204,7 @@ pub struct SyncWorker { config: SyncWorkerConfig, rt: RT, state: SyncState, - host: ResolvedHost, + host: ResolvedHostname, rx: UnboundedReceiver<(ClientMessage, RT::Instant)>, tx: SingleFlightSender, @@ -245,7 +245,7 @@ impl SyncWorker { pub fn new( api: Arc, rt: RT, - host: ResolvedHost, + host: ResolvedHostname, config: SyncWorkerConfig, rx: UnboundedReceiver<(ClientMessage, RT::Instant)>, tx: SingleFlightSender,