mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
## Problem We want to have the data-api served by the proxy directly instead of relying on a 3rd party to run a deployment for each project/endpoint. ## Summary of changes With the changes below, the proxy (auth-broker) becomes also a "rest-broker", that can be thought of as a "Multi-tenant" data-api which provides an automated REST api for all the databases in the region. The core of the implementation (that leverages the subzero library) is in proxy/src/serverless/rest.rs and this is the only place that has "new logic". --------- Co-authored-by: Ruslan Talpa <ruslan.talpa@databricks.com> Co-authored-by: Alexander Bayandin <alexander@neon.tech> Co-authored-by: Conrad Ludgate <conrad@neon.tech>
33 lines
935 B
Rust
33 lines
935 B
Rust
use std::pin::pin;
|
|
|
|
use futures::future::{Either, select};
|
|
use tokio_util::sync::CancellationToken;
|
|
|
|
pub async fn run_until_cancelled<F: Future>(
|
|
f: F,
|
|
cancellation_token: &CancellationToken,
|
|
) -> Option<F::Output> {
|
|
run_until(f, cancellation_token.cancelled()).await.ok()
|
|
}
|
|
|
|
/// Runs the future `f` unless interrupted by future `condition`.
|
|
pub async fn run_until<F1: Future, F2: Future>(
|
|
f: F1,
|
|
condition: F2,
|
|
) -> Result<F1::Output, F2::Output> {
|
|
match select(pin!(f), pin!(condition)).await {
|
|
Either::Left((f1, _)) => Ok(f1),
|
|
Either::Right((f2, _)) => Err(f2),
|
|
}
|
|
}
|
|
|
|
pub fn deserialize_json_string<'de, D, T>(deserializer: D) -> Result<T, D::Error>
|
|
where
|
|
T: for<'de2> serde::Deserialize<'de2>,
|
|
D: serde::Deserializer<'de>,
|
|
{
|
|
use serde::Deserialize;
|
|
let s = String::deserialize(deserializer)?;
|
|
serde_json::from_str(&s).map_err(<D::Error as serde::de::Error>::custom)
|
|
}
|