use crate::codec::remote::{
from_wire_list_remotes_response, from_wire_registration_check_response, from_wire_remote,
to_wire_create_remote_request, to_wire_delete_remote_request, to_wire_list_remotes_request,
to_wire_registration_check_request,
};
use crate::generated::v1;
use crate::rpc_support::GestaltError;
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateRemoteRequest {
pub tunnel: Option<TunnelEndpoint>,
pub providers: Vec<RemoteProviderDefinition>,
pub expected_generation: u64,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteRemoteRequest {
pub id: String,
pub expected_generation: u64,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListRemotesRequest {}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ListRemotesResponse {
pub remotes: Vec<Remote>,
pub server_identity: Option<ServerIdentity>,
pub tunnel: Option<TunnelBootstrap>,
#[serde(with = "crate::serde_duration")]
pub lease_duration: Option<std::time::Duration>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProviderRef {
pub kind: String,
pub name: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegistrationCheckRequest {
pub registration_id: String,
pub generation: u64,
pub providers: Vec<ProviderRef>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegistrationCheckResponse {
pub ready: bool,
pub message: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Remote {
pub id: String,
pub owner_subject_id: String,
pub generation: u64,
pub providers: Vec<RemoteProviderSummary>,
pub reachability: Option<RemoteReachability>,
pub server_spki_sha256: String,
#[serde(with = "crate::serde_time")]
pub created_at: Option<std::time::SystemTime>,
#[serde(with = "crate::serde_time")]
pub updated_at: Option<std::time::SystemTime>,
#[serde(with = "crate::serde_time")]
pub last_checked_at: Option<std::time::SystemTime>,
#[serde(with = "crate::serde_time")]
pub last_successful_heartbeat_at: Option<std::time::SystemTime>,
pub last_error: String,
#[serde(with = "crate::serde_time")]
pub lease_expires_at: Option<std::time::SystemTime>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoteProviderDefinition {
pub kind: String,
pub name: String,
pub definition: Option<serde_json::Map<String, serde_json::Value>>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoteProviderSummary {
pub kind: String,
pub name: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoteReachability {
pub reachable: bool,
pub message: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerIdentity {
pub client_spki_sha256: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TunnelBootstrap {
pub frps_address: String,
#[serde(with = "crate::serde_duration")]
pub lease_duration: Option<std::time::Duration>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TunnelEndpoint {
pub host: String,
pub certificate: Vec<u8>,
pub server_spki_sha256: String,
}
pub struct RegistrationLifecycle {
inner:
v1::registration_lifecycle_client::RegistrationLifecycleClient<tonic::transport::Channel>,
timeout: Option<std::time::Duration>,
}
impl RegistrationLifecycle {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::registration_lifecycle_client::RegistrationLifecycleClient::new(channel),
timeout: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub async fn check(
&mut self,
request: RegistrationCheckRequest,
) -> Result<RegistrationCheckResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_registration_check_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.check(tonic_request).await?;
Ok(from_wire_registration_check_response(response.into_inner()))
}
}
pub struct RemoteManagement {
inner: v1::remote_management_client::RemoteManagementClient<tonic::transport::Channel>,
timeout: Option<std::time::Duration>,
}
impl RemoteManagement {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::remote_management_client::RemoteManagementClient::new(channel),
timeout: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub async fn create_remote(
&mut self,
request: CreateRemoteRequest,
) -> Result<Remote, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_create_remote_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.create_remote(tonic_request).await?;
Ok(from_wire_remote(response.into_inner()))
}
pub async fn list_remotes(
&mut self,
request: ListRemotesRequest,
) -> Result<ListRemotesResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_list_remotes_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.list_remotes(tonic_request).await?;
Ok(from_wire_list_remotes_response(response.into_inner()))
}
pub async fn delete_remote(
&mut self,
request: DeleteRemoteRequest,
) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_delete_remote_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete_remote(tonic_request).await?;
Ok(())
}
}