From a2b50b728d0e6556c73edfdecd32665bc64772bb Mon Sep 17 00:00:00 2001 From: Alexander van Saase Date: Fri, 3 May 2024 22:58:28 +0200 Subject: [PATCH] Hyperdrive binding (#566) * Starting to add hyperdrive binding * Add Hyperdrive getters * Expose getters from worker crate --- worker-sys/src/types.rs | 2 + worker-sys/src/types/hyperdrive.rs | 26 ++++++++++++ worker/src/env.rs | 6 ++- worker/src/hyperdrive.rs | 65 ++++++++++++++++++++++++++++++ worker/src/lib.rs | 1 + 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 worker-sys/src/types/hyperdrive.rs create mode 100644 worker/src/hyperdrive.rs diff --git a/worker-sys/src/types.rs b/worker-sys/src/types.rs index 3ce2f2a4..6f5e0a90 100644 --- a/worker-sys/src/types.rs +++ b/worker-sys/src/types.rs @@ -6,6 +6,7 @@ mod durable_object; mod dynamic_dispatcher; mod fetcher; mod fixed_length_stream; +mod hyperdrive; mod incoming_request_cf_properties; #[cfg(feature = "queue")] mod queue; @@ -23,6 +24,7 @@ pub use durable_object::*; pub use dynamic_dispatcher::*; pub use fetcher::*; pub use fixed_length_stream::*; +pub use hyperdrive::*; pub use incoming_request_cf_properties::*; #[cfg(feature = "queue")] pub use queue::*; diff --git a/worker-sys/src/types/hyperdrive.rs b/worker-sys/src/types/hyperdrive.rs new file mode 100644 index 00000000..ef74d695 --- /dev/null +++ b/worker-sys/src/types/hyperdrive.rs @@ -0,0 +1,26 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(extends=js_sys::Object)] + #[derive(Clone, PartialEq, Eq)] + pub type Hyperdrive; + + #[wasm_bindgen(method, getter, js_name=connectionString)] + pub fn connection_string(this: &Hyperdrive) -> String; + + #[wasm_bindgen(method, getter, js_name=host)] + pub fn host(this: &Hyperdrive) -> String; + + #[wasm_bindgen(method, getter, js_name=port)] + pub fn port(this: &Hyperdrive) -> u16; + + #[wasm_bindgen(method, getter, js_name=user)] + pub fn user(this: &Hyperdrive) -> String; + + #[wasm_bindgen(method, getter, js_name=password)] + pub fn password(this: &Hyperdrive) -> String; + + #[wasm_bindgen(method, getter, js_name=database)] + pub fn database(this: &Hyperdrive) -> String; +} diff --git a/worker/src/env.rs b/worker/src/env.rs index ceb3ba71..fe79d03a 100644 --- a/worker/src/env.rs +++ b/worker/src/env.rs @@ -2,10 +2,10 @@ use std::fmt::Display; #[cfg(feature = "d1")] use crate::d1::D1Database; -use crate::error::Error; #[cfg(feature = "queue")] use crate::Queue; use crate::{durable::ObjectNamespace, Bucket, DynamicDispatcher, Fetcher, Result}; +use crate::{error::Error, hyperdrive::Hyperdrive}; use js_sys::Object; use wasm_bindgen::{prelude::*, JsCast, JsValue}; @@ -85,6 +85,10 @@ impl Env { pub fn d1(&self, binding: &str) -> Result { self.get_binding(binding) } + + pub fn hyperdrive(&self, binding: &str) -> Result { + self.get_binding(binding) + } } pub trait EnvBinding: Sized + JsCast { diff --git a/worker/src/hyperdrive.rs b/worker/src/hyperdrive.rs new file mode 100644 index 00000000..22fd26ba --- /dev/null +++ b/worker/src/hyperdrive.rs @@ -0,0 +1,65 @@ +use wasm_bindgen::{JsCast, JsValue}; +use worker_sys::types::Hyperdrive as HyperdriveSys; + +use crate::EnvBinding; + +pub struct Hyperdrive(HyperdriveSys); + +unsafe impl Send for Hyperdrive {} +unsafe impl Sync for Hyperdrive {} + +impl EnvBinding for Hyperdrive { + const TYPE_NAME: &'static str = "Hyperdrive"; +} + +impl JsCast for Hyperdrive { + fn instanceof(val: &JsValue) -> bool { + val.is_instance_of::() + } + + fn unchecked_from_js(val: JsValue) -> Self { + Self(val.into()) + } + + fn unchecked_from_js_ref(val: &JsValue) -> &Self { + unsafe { &*(val as *const JsValue as *const Self) } + } +} + +impl AsRef for Hyperdrive { + fn as_ref(&self) -> &JsValue { + &self.0 + } +} + +impl From for JsValue { + fn from(hyperdrive: Hyperdrive) -> Self { + JsValue::from(hyperdrive.0) + } +} + +impl Hyperdrive { + pub fn connection_string(&self) -> String { + self.0.connection_string() + } + + pub fn host(&self) -> String { + self.0.host() + } + + pub fn port(&self) -> u16 { + self.0.port() + } + + pub fn user(&self) -> String { + self.0.user() + } + + pub fn password(&self) -> String { + self.0.password() + } + + pub fn database(&self) -> String { + self.0.database() + } +} diff --git a/worker/src/lib.rs b/worker/src/lib.rs index b9d78545..57d5808b 100644 --- a/worker/src/lib.rs +++ b/worker/src/lib.rs @@ -212,6 +212,7 @@ mod formdata; mod global; mod headers; mod http; +mod hyperdrive; #[cfg(feature = "queue")] mod queue; mod r2;