Skip to content

Commit

Permalink
Implement component traits on ComponentCtx (#421)
Browse files Browse the repository at this point in the history
Switch to implementing component traits on ComponentCtx instead of Session. This gives us access to the resource table, which will allow us to support the use of resources like the new fastly:api/kv-store/lookup-result resource.
  • Loading branch information
elliottt authored Aug 28, 2024
1 parent c70154b commit ceed333
Show file tree
Hide file tree
Showing 22 changed files with 280 additions and 200 deletions.
7 changes: 4 additions & 3 deletions lib/src/component/async_io.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use {
super::fastly::api::{async_io, types},
crate::{session::Session, wiggle_abi},
crate::{linking::ComponentCtx, wiggle_abi},
futures::FutureExt,
std::time::Duration,
};

#[async_trait::async_trait]
impl async_io::Host for Session {
impl async_io::Host for ComponentCtx {
async fn select(
&mut self,
hs: Vec<async_io::Handle>,
Expand All @@ -16,7 +16,7 @@ impl async_io::Host for Session {
return Err(types::Error::InvalidArgument.into());
}

let select_fut = self.select_impl(
let select_fut = self.session.select_impl(
hs.iter()
.copied()
.map(|i| wiggle_abi::types::AsyncItemHandle::from(i).into()),
Expand Down Expand Up @@ -44,6 +44,7 @@ impl async_io::Host for Session {
async fn is_ready(&mut self, handle: async_io::Handle) -> Result<bool, types::Error> {
let handle = wiggle_abi::types::AsyncItemHandle::from(handle);
Ok(self
.session
.async_item_mut(handle.into())?
.await_ready()
.now_or_never()
Expand Down
60 changes: 45 additions & 15 deletions lib/src/component/backend.rs
Original file line number Diff line number Diff line change
@@ -1,35 +1,41 @@
use {
super::fastly::api::{backend, http_types, types},
crate::{error::Error, session::Session},
crate::{error::Error, linking::ComponentCtx},
};

#[async_trait::async_trait]
impl backend::Host for Session {
impl backend::Host for ComponentCtx {
async fn exists(&mut self, backend: String) -> Result<bool, types::Error> {
Ok(self.backend(&backend).is_some())
Ok(self.session.backend(&backend).is_some())
}

async fn is_healthy(
&mut self,
backend: String,
) -> Result<backend::BackendHealth, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
Ok(backend::BackendHealth::Unknown)
}

async fn is_dynamic(&mut self, backend: String) -> Result<bool, types::Error> {
if self.dynamic_backend(&backend).is_some() {
if self.session.dynamic_backend(&backend).is_some() {
Ok(true)
} else if self.backend(&backend).is_some() {
} else if self.session.backend(&backend).is_some() {
Ok(false)
} else {
Err(Error::InvalidArgument.into())
}
}

async fn get_host(&mut self, backend: String, max_len: u64) -> Result<String, types::Error> {
let backend = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let backend = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;

let host = backend.uri.host().expect("backend uri has host");

Expand All @@ -49,7 +55,10 @@ impl backend::Host for Session {
backend: String,
max_len: u64,
) -> Result<Option<Vec<u8>>, types::Error> {
let backend = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let backend = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
if let Some(host) = backend.override_host.as_ref() {
let host = host.to_str()?;

Expand All @@ -68,7 +77,10 @@ impl backend::Host for Session {
}

async fn get_port(&mut self, backend: String) -> Result<u16, types::Error> {
let backend = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let backend = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
match backend.uri.port_u16() {
Some(port) => Ok(port),
None => {
Expand All @@ -83,7 +95,10 @@ impl backend::Host for Session {

async fn get_connect_timeout_ms(&mut self, backend: String) -> Result<u32, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
Err(Error::Unsupported {
msg: "connection timing is not actually supported in Viceroy",
}
Expand All @@ -92,7 +107,10 @@ impl backend::Host for Session {

async fn get_first_byte_timeout_ms(&mut self, backend: String) -> Result<u32, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
Err(Error::Unsupported {
msg: "connection timing is not actually supported in Viceroy",
}
Expand All @@ -101,15 +119,21 @@ impl backend::Host for Session {

async fn get_between_bytes_timeout_ms(&mut self, backend: String) -> Result<u32, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
Err(Error::Unsupported {
msg: "connection timing is not actually supported in Viceroy",
}
.into())
}

async fn is_ssl(&mut self, backend: String) -> Result<bool, types::Error> {
let backend = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let backend = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
Ok(backend.uri.scheme() == Some(&http::uri::Scheme::HTTPS))
}

Expand All @@ -118,7 +142,10 @@ impl backend::Host for Session {
backend: String,
) -> Result<Option<http_types::TlsVersion>, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
// health checks are not enabled in Viceroy :(
Err(Error::Unsupported {
msg: "ssl version flags are not supported in Viceroy",
Expand All @@ -131,7 +158,10 @@ impl backend::Host for Session {
backend: String,
) -> Result<Option<http_types::TlsVersion>, types::Error> {
// just doing this to get a different error if the backend doesn't exist
let _ = self.backend(&backend).ok_or(Error::InvalidArgument)?;
let _ = self
.session
.backend(&backend)
.ok_or(Error::InvalidArgument)?;
// health checks are not enabled in Viceroy :(
Err(Error::Unsupported {
msg: "ssl version flags are not supported in Viceroy",
Expand Down
4 changes: 2 additions & 2 deletions lib/src/component/cache.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use {
super::fastly::api::{cache, http_types, types},
crate::{error::Error, session::Session},
crate::{error::Error, linking::ComponentCtx},
};

#[async_trait::async_trait]
impl cache::Host for Session {
impl cache::Host for ComponentCtx {
async fn lookup(
&mut self,
_key: String,
Expand Down
6 changes: 3 additions & 3 deletions lib/src/component/compute_runtime.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use super::fastly::api::{compute_runtime, types};
use crate::session::Session;
use crate::linking::ComponentCtx;
use std::sync::atomic::Ordering;

#[async_trait::async_trait]
impl compute_runtime::Host for Session {
impl compute_runtime::Host for ComponentCtx {
async fn get_vcpu_ms(&mut self) -> Result<u64, types::Error> {
Ok(self.active_cpu_time_us.load(Ordering::SeqCst) / 1000)
Ok(self.session.active_cpu_time_us.load(Ordering::SeqCst) / 1000)
}
}
8 changes: 4 additions & 4 deletions lib/src/component/config_store.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use {
super::fastly::api::{config_store, types},
crate::session::Session,
crate::linking::ComponentCtx,
};

#[async_trait::async_trait]
impl config_store::Host for Session {
impl config_store::Host for ComponentCtx {
async fn open(&mut self, name: String) -> Result<config_store::Handle, types::Error> {
let handle = self.dictionary_handle(name.as_str())?;
let handle = self.session.dictionary_handle(name.as_str())?;
Ok(handle.into())
}

Expand All @@ -16,7 +16,7 @@ impl config_store::Host for Session {
name: String,
max_len: u64,
) -> Result<Option<Vec<u8>>, types::Error> {
let dict = &self.dictionary(store.into())?.contents;
let dict = &self.session.dictionary(store.into())?.contents;

let item = if let Some(item) = dict.get(&name) {
item
Expand Down
6 changes: 3 additions & 3 deletions lib/src/component/device_detection.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
use {
super::fastly::api::{device_detection, types},
crate::session::Session,
crate::linking::ComponentCtx,
};

#[async_trait::async_trait]
impl device_detection::Host for Session {
impl device_detection::Host for ComponentCtx {
async fn lookup(
&mut self,
user_agent: String,
max_len: u64,
) -> Result<Option<Vec<u8>>, types::Error> {
if let Some(result) = self.device_detection_lookup(&user_agent) {
if let Some(result) = self.session.device_detection_lookup(&user_agent) {
if result.len() > max_len as usize {
return Err(types::Error::BufferLen(
u64::try_from(result.len()).unwrap_or(0),
Expand Down
8 changes: 4 additions & 4 deletions lib/src/component/dictionary.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use {
super::fastly::api::{dictionary, types},
crate::session::Session,
crate::linking::ComponentCtx,
};

#[async_trait::async_trait]
impl dictionary::Host for Session {
impl dictionary::Host for ComponentCtx {
async fn open(&mut self, name: String) -> Result<dictionary::Handle, types::Error> {
let handle = self.dictionary_handle(name.as_str())?;
let handle = self.session.dictionary_handle(name.as_str())?;
Ok(handle.into())
}

Expand All @@ -16,7 +16,7 @@ impl dictionary::Host for Session {
key: String,
max_len: u64,
) -> Result<Option<Vec<u8>>, types::Error> {
let dict = &self.dictionary(h.into())?.contents;
let dict = &self.session.dictionary(h.into())?.contents;

let item = if let Some(item) = dict.get(&key) {
item
Expand Down
4 changes: 2 additions & 2 deletions lib/src/component/erl.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
use {
super::fastly::api::{erl, types},
crate::session::Session,
crate::linking::ComponentCtx,
};

#[async_trait::async_trait]
impl erl::Host for Session {
impl erl::Host for ComponentCtx {
async fn check_rate(
&mut self,
_rc: String,
Expand Down
5 changes: 3 additions & 2 deletions lib/src/component/geo.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use {
super::fastly::api::{geo, types},
crate::{error, session::Session},
crate::{error, linking::ComponentCtx},
std::net::{IpAddr, Ipv4Addr, Ipv6Addr},
};

#[async_trait::async_trait]
impl geo::Host for Session {
impl geo::Host for ComponentCtx {
async fn lookup(&mut self, octets: Vec<u8>, max_len: u64) -> Result<Vec<u8>, types::Error> {
let ip_addr: IpAddr = match octets.len() {
4 => IpAddr::V4(Ipv4Addr::from(
Expand All @@ -18,6 +18,7 @@ impl geo::Host for Session {
};

let json = self
.session
.geolocation_lookup(&ip_addr)
.ok_or(geo::Error::UnknownError)?;

Expand Down
Loading

0 comments on commit ceed333

Please sign in to comment.