Refactor: split gatekeeper into sensible chunks
/ build (push) Successful in 4m25s
Details
/ build (push) Successful in 4m25s
Details
This commit is contained in:
parent
b10acaf4a6
commit
c989c3a849
|
@ -1,4 +1,5 @@
|
|||
use preserves_schema::Codec;
|
||||
use services::gatekeeper;
|
||||
|
||||
use std::convert::TryInto;
|
||||
use std::io;
|
||||
|
@ -20,11 +21,11 @@ use syndicate::value::NestedValue;
|
|||
|
||||
mod counter;
|
||||
mod dependencies;
|
||||
mod gatekeeper;
|
||||
mod http;
|
||||
mod language;
|
||||
mod lifecycle;
|
||||
mod protocol;
|
||||
mod resolution;
|
||||
mod script;
|
||||
mod services;
|
||||
|
||||
|
@ -118,10 +119,7 @@ async fn main() -> ActorResult {
|
|||
}));
|
||||
}
|
||||
|
||||
let gatekeeper = Cap::guard(Language::arc(), t.create(
|
||||
syndicate::entity(Arc::clone(&server_config_ds))
|
||||
.on_asserted_facet(gatekeeper::facet_handle_resolve)));
|
||||
gatekeeper::handle_binds(t, &server_config_ds)?;
|
||||
let gatekeeper = gatekeeper::create_gatekeeper(t, &server_config_ds)?;
|
||||
|
||||
let mut env = Map::new();
|
||||
env.insert("config".to_owned(), AnyValue::domain(Arc::clone(&server_config_ds)));
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
use std::sync::Arc;
|
||||
use syndicate::actor::*;
|
||||
use syndicate::schemas::gatekeeper;
|
||||
|
||||
use syndicate::enclose;
|
||||
|
||||
use crate::language;
|
||||
|
||||
pub mod sturdy;
|
||||
pub mod noise;
|
||||
|
||||
fn handle_direct_resolution(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
a: gatekeeper::Resolve,
|
||||
) -> Result<FacetId, ActorError> {
|
||||
let outer_facet = t.facet_id();
|
||||
t.facet(move |t| {
|
||||
let handler = syndicate::entity(a.observer)
|
||||
.on_asserted(move |observer, t, a: AnyValue| {
|
||||
t.stop_facet_and_continue(outer_facet, Some(
|
||||
enclose!((observer, a) move |t: &mut Activation| {
|
||||
observer.assert(t, language(), &a);
|
||||
Ok(())
|
||||
})))?;
|
||||
Ok(None)
|
||||
})
|
||||
.create_cap(t);
|
||||
ds.assert(t, language(), &gatekeeper::Resolve {
|
||||
step: a.step.clone(),
|
||||
observer: handler,
|
||||
});
|
||||
Ok(())
|
||||
})
|
||||
}
|
|
@ -4,56 +4,34 @@ use noise_protocol::patterns::HandshakePattern;
|
|||
use noise_rust_crypto::Blake2s;
|
||||
use noise_rust_crypto::ChaCha20Poly1305;
|
||||
use noise_rust_crypto::X25519;
|
||||
use preserves_schema::Codec;
|
||||
use syndicate::relay::Mutex;
|
||||
use syndicate::relay::TunnelRelay;
|
||||
use syndicate::trace::TurnCause;
|
||||
use syndicate::value::NoEmbeddedDomainCodec;
|
||||
use syndicate::value::packed::PackedWriter;
|
||||
|
||||
use std::convert::TryInto;
|
||||
use std::sync::Arc;
|
||||
|
||||
use syndicate::actor::*;
|
||||
use syndicate::enclose;
|
||||
use syndicate::value::NestedValue;
|
||||
use syndicate::schemas::dataspace;
|
||||
use syndicate::schemas::gatekeeper;
|
||||
use syndicate::schemas::noise;
|
||||
use syndicate::schemas::sturdy;
|
||||
use preserves_schema::Codec;
|
||||
|
||||
use crate::language::language;
|
||||
use syndicate::actor::*;
|
||||
use syndicate::relay::Mutex;
|
||||
use syndicate::relay::TunnelRelay;
|
||||
use syndicate::trace::TurnCause;
|
||||
use syndicate::value::NestedValue;
|
||||
use syndicate::value::NoEmbeddedDomainCodec;
|
||||
use syndicate::value::PackedWriter;
|
||||
|
||||
use syndicate_macros::during;
|
||||
use syndicate_macros::pattern;
|
||||
|
||||
fn sturdy_step_type() -> String {
|
||||
language().unparse(&sturdy::SturdyStepType).value().to_symbol().unwrap().clone()
|
||||
}
|
||||
use syndicate::schemas::dataspace;
|
||||
use syndicate::schemas::gatekeeper;
|
||||
use syndicate::schemas::noise;
|
||||
|
||||
use crate::language;
|
||||
|
||||
fn noise_step_type() -> String {
|
||||
language().unparse(&noise::NoiseStepType).value().to_symbol().unwrap().clone()
|
||||
}
|
||||
|
||||
pub fn handle_binds(t: &mut Activation, ds: &Arc<Cap>) -> ActorResult {
|
||||
during!(t, ds, language(), <bind <ref $desc> $target $observer>, |t: &mut Activation| {
|
||||
t.spawn_link(None, move |t| {
|
||||
target.value().to_embedded()?;
|
||||
let observer = language().parse::<gatekeeper::BindObserver>(&observer)?;
|
||||
let desc = language().parse::<sturdy::SturdyDescriptionDetail>(&desc)?;
|
||||
let sr = sturdy::SturdyRef::mint(desc.oid, &desc.key);
|
||||
if let gatekeeper::BindObserver::Present(o) = observer {
|
||||
o.assert(t, language(), &gatekeeper::Bound::Bound {
|
||||
path_step: Box::new(gatekeeper::PathStep {
|
||||
step_type: sturdy_step_type(),
|
||||
detail: language().unparse(&sr.parameters),
|
||||
}),
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
Ok(())
|
||||
});
|
||||
pub fn handle_noise_binds(t: &mut Activation, ds: &Arc<Cap>) -> ActorResult {
|
||||
during!(t, ds, language(), <bind <noise $desc> $target $observer>, |t: &mut Activation| {
|
||||
t.spawn_link(None, move |t| {
|
||||
target.value().to_embedded()?;
|
||||
|
@ -102,108 +80,18 @@ pub fn handle_binds(t: &mut Activation, ds: &Arc<Cap>) -> ActorResult {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub fn facet_handle_resolve(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
a: gatekeeper::Resolve,
|
||||
) -> ActorResult {
|
||||
let mut detail: &'static str = "unsupported";
|
||||
|
||||
if a.step.step_type == sturdy_step_type() {
|
||||
detail = "invalid";
|
||||
if let Ok(s) = language().parse::<sturdy::SturdyStepDetail>(&a.step.detail) {
|
||||
t.facet(|t| {
|
||||
let f = handle_direct_resolution(ds, t, a.clone())?;
|
||||
await_bind_sturdyref(ds, t, sturdy::SturdyRef { parameters: s.0 }, a.observer, f)
|
||||
})?;
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take_noise_step(t: &mut Activation, ds: &mut Arc<Cap>, a: &gatekeeper::Resolve, detail: &mut &'static str) -> Result<bool, ActorError> {
|
||||
if a.step.step_type == noise_step_type() {
|
||||
detail = "invalid";
|
||||
*detail = "invalid";
|
||||
if let Ok(s) = language().parse::<noise::NoiseStepDetail<AnyValue>>(&a.step.detail) {
|
||||
t.facet(|t| {
|
||||
let f = handle_direct_resolution(ds, t, a.clone())?;
|
||||
await_bind_noise(ds, t, s.0.0, a.observer, f)
|
||||
let f = super::handle_direct_resolution(ds, t, a.clone())?;
|
||||
await_bind_noise(ds, t, s.0.0, a.observer.clone(), f)
|
||||
})?;
|
||||
return Ok(());
|
||||
return Ok(true);
|
||||
}
|
||||
}
|
||||
|
||||
a.observer.assert(t, language(), &gatekeeper::Rejected {
|
||||
detail: AnyValue::symbol(detail),
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_direct_resolution(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
a: gatekeeper::Resolve,
|
||||
) -> Result<FacetId, ActorError> {
|
||||
let outer_facet = t.facet_id();
|
||||
t.facet(move |t| {
|
||||
let handler = syndicate::entity(a.observer)
|
||||
.on_asserted(move |observer, t, a: AnyValue| {
|
||||
t.stop_facet_and_continue(outer_facet, Some(
|
||||
enclose!((observer, a) move |t: &mut Activation| {
|
||||
observer.assert(t, language(), &a);
|
||||
Ok(())
|
||||
})))?;
|
||||
Ok(None)
|
||||
})
|
||||
.create_cap(t);
|
||||
ds.assert(t, language(), &gatekeeper::Resolve {
|
||||
step: a.step.clone(),
|
||||
observer: handler,
|
||||
});
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
fn await_bind_sturdyref(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
sturdyref: sturdy::SturdyRef,
|
||||
observer: Arc<Cap>,
|
||||
direct_resolution_facet: FacetId,
|
||||
) -> ActorResult {
|
||||
let queried_oid = sturdyref.parameters.oid.clone();
|
||||
let handler = syndicate::entity(observer)
|
||||
.on_asserted(move |observer, t, a: AnyValue| {
|
||||
t.stop_facet(direct_resolution_facet);
|
||||
let bindings = a.value().to_sequence()?;
|
||||
let key = bindings[0].value().to_bytestring()?;
|
||||
let unattenuated_target = bindings[1].value().to_embedded()?;
|
||||
match sturdyref.validate_and_attenuate(key, unattenuated_target) {
|
||||
Err(e) => {
|
||||
tracing::warn!(sturdyref = ?language().unparse(&sturdyref),
|
||||
"sturdyref failed validation: {}", e);
|
||||
observer.assert(t, language(), &gatekeeper::Resolved::Rejected(
|
||||
Box::new(gatekeeper::Rejected {
|
||||
detail: AnyValue::symbol("sturdyref-failed-validation"),
|
||||
})));
|
||||
},
|
||||
Ok(target) => {
|
||||
tracing::trace!(sturdyref = ?language().unparse(&sturdyref),
|
||||
?target,
|
||||
"sturdyref resolved");
|
||||
observer.assert(t, language(), &gatekeeper::Resolved::Accepted {
|
||||
responder_session: target,
|
||||
});
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
})
|
||||
.create_cap(t);
|
||||
ds.assert(t, language(), &dataspace::Observe {
|
||||
// TODO: codegen plugin to generate pattern constructors
|
||||
pattern: pattern!{<bind <ref { oid: #(&queried_oid), key: $ }> $ _>},
|
||||
observer: handler,
|
||||
});
|
||||
Ok(())
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
struct ValidatedNoiseSpec {
|
|
@ -0,0 +1,98 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use preserves_schema::Codec;
|
||||
|
||||
use syndicate::actor::*;
|
||||
use syndicate::value::NestedValue;
|
||||
|
||||
use syndicate_macros::during;
|
||||
use syndicate_macros::pattern;
|
||||
|
||||
use syndicate::schemas::dataspace;
|
||||
use syndicate::schemas::gatekeeper;
|
||||
use syndicate::schemas::sturdy;
|
||||
|
||||
use crate::language;
|
||||
|
||||
fn sturdy_step_type() -> String {
|
||||
language().unparse(&sturdy::SturdyStepType).value().to_symbol().unwrap().clone()
|
||||
}
|
||||
|
||||
pub fn handle_sturdy_binds(t: &mut Activation, ds: &Arc<Cap>) -> ActorResult {
|
||||
during!(t, ds, language(), <bind <ref $desc> $target $observer>, |t: &mut Activation| {
|
||||
t.spawn_link(None, move |t| {
|
||||
target.value().to_embedded()?;
|
||||
let observer = language().parse::<gatekeeper::BindObserver>(&observer)?;
|
||||
let desc = language().parse::<sturdy::SturdyDescriptionDetail>(&desc)?;
|
||||
let sr = sturdy::SturdyRef::mint(desc.oid, &desc.key);
|
||||
if let gatekeeper::BindObserver::Present(o) = observer {
|
||||
o.assert(t, language(), &gatekeeper::Bound::Bound {
|
||||
path_step: Box::new(gatekeeper::PathStep {
|
||||
step_type: sturdy_step_type(),
|
||||
detail: language().unparse(&sr.parameters),
|
||||
}),
|
||||
});
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
Ok(())
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn take_sturdy_step(t: &mut Activation, ds: &mut Arc<Cap>, a: &gatekeeper::Resolve, detail: &mut &'static str) -> Result<bool, ActorError> {
|
||||
if a.step.step_type == sturdy_step_type() {
|
||||
*detail = "invalid";
|
||||
if let Ok(s) = language().parse::<sturdy::SturdyStepDetail>(&a.step.detail) {
|
||||
t.facet(|t| {
|
||||
let f = super::handle_direct_resolution(ds, t, a.clone())?;
|
||||
await_bind_sturdyref(ds, t, sturdy::SturdyRef { parameters: s.0 }, a.observer.clone(), f)
|
||||
})?;
|
||||
return Ok(true);
|
||||
}
|
||||
}
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
fn await_bind_sturdyref(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
sturdyref: sturdy::SturdyRef,
|
||||
observer: Arc<Cap>,
|
||||
direct_resolution_facet: FacetId,
|
||||
) -> ActorResult {
|
||||
let queried_oid = sturdyref.parameters.oid.clone();
|
||||
let handler = syndicate::entity(observer)
|
||||
.on_asserted(move |observer, t, a: AnyValue| {
|
||||
t.stop_facet(direct_resolution_facet);
|
||||
let bindings = a.value().to_sequence()?;
|
||||
let key = bindings[0].value().to_bytestring()?;
|
||||
let unattenuated_target = bindings[1].value().to_embedded()?;
|
||||
match sturdyref.validate_and_attenuate(key, unattenuated_target) {
|
||||
Err(e) => {
|
||||
tracing::warn!(sturdyref = ?language().unparse(&sturdyref),
|
||||
"sturdyref failed validation: {}", e);
|
||||
observer.assert(t, language(), &gatekeeper::Resolved::Rejected(
|
||||
Box::new(gatekeeper::Rejected {
|
||||
detail: AnyValue::symbol("sturdyref-failed-validation"),
|
||||
})));
|
||||
},
|
||||
Ok(target) => {
|
||||
tracing::trace!(sturdyref = ?language().unparse(&sturdyref),
|
||||
?target,
|
||||
"sturdyref resolved");
|
||||
observer.assert(t, language(), &gatekeeper::Resolved::Accepted {
|
||||
responder_session: target,
|
||||
});
|
||||
}
|
||||
}
|
||||
Ok(None)
|
||||
})
|
||||
.create_cap(t);
|
||||
ds.assert(t, language(), &dataspace::Observe {
|
||||
// TODO: codegen plugin to generate pattern constructors
|
||||
pattern: pattern!{<bind <ref { oid: #(&queried_oid), key: $ }> $ _>},
|
||||
observer: handler,
|
||||
});
|
||||
Ok(())
|
||||
}
|
|
@ -6,15 +6,17 @@ use syndicate::actor::*;
|
|||
use syndicate::enclose;
|
||||
use syndicate::preserves::rec;
|
||||
use syndicate::preserves::value::NestedValue;
|
||||
use syndicate::schemas::gatekeeper;
|
||||
|
||||
use syndicate_macros::during;
|
||||
|
||||
use crate::gatekeeper;
|
||||
use crate::language::Language;
|
||||
use crate::language::language;
|
||||
use crate::lifecycle;
|
||||
use crate::resolution::sturdy;
|
||||
use crate::resolution::noise;
|
||||
use crate::schemas::internal_services::Gatekeeper;
|
||||
|
||||
use syndicate_macros::during;
|
||||
|
||||
pub fn on_demand(t: &mut Activation, ds: Arc<Cap>) {
|
||||
t.spawn(Some(AnyValue::symbol("gatekeeper_listener")), move |t| {
|
||||
Ok(during!(t, ds, language(), <run-service $spec: Gatekeeper::<AnyValue>>, |t: &mut Activation| {
|
||||
|
@ -25,15 +27,35 @@ pub fn on_demand(t: &mut Activation, ds: Arc<Cap>) {
|
|||
});
|
||||
}
|
||||
|
||||
pub fn create_gatekeeper(t: &mut Activation, bindspace: &Arc<Cap>) -> Result<Arc<Cap>, ActorError> {
|
||||
sturdy::handle_sturdy_binds(t, bindspace)?;
|
||||
noise::handle_noise_binds(t, bindspace)?;
|
||||
Ok(Cap::guard(Language::arc(), t.create(
|
||||
syndicate::entity(Arc::clone(bindspace))
|
||||
.on_asserted_facet(facet_handle_resolve))))
|
||||
}
|
||||
|
||||
fn run(t: &mut Activation, ds: Arc<Cap>, spec: Gatekeeper<AnyValue>) -> ActorResult {
|
||||
let resolver = t.create(syndicate::entity(Arc::clone(&spec.bindspace))
|
||||
.on_asserted_facet(gatekeeper::facet_handle_resolve));
|
||||
let gk = create_gatekeeper(t, &spec.bindspace)?;
|
||||
ds.assert(t, language(), &syndicate::schemas::service::ServiceObject {
|
||||
service_name: language().unparse(&spec),
|
||||
object: AnyValue::domain(Cap::guard(Language::arc(), resolver)),
|
||||
object: AnyValue::domain(gk),
|
||||
});
|
||||
gatekeeper::handle_binds(t, &spec.bindspace)?;
|
||||
ds.assert(t, language(), &lifecycle::started(&spec));
|
||||
ds.assert(t, language(), &lifecycle::ready(&spec));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn facet_handle_resolve(
|
||||
ds: &mut Arc<Cap>,
|
||||
t: &mut Activation,
|
||||
a: gatekeeper::Resolve,
|
||||
) -> ActorResult {
|
||||
let mut detail: &'static str = "unsupported";
|
||||
if sturdy::take_sturdy_step(t, ds, &a, &mut detail)? { return Ok(()); }
|
||||
if noise::take_noise_step(t, ds, &a, &mut detail)? { return Ok(()); }
|
||||
a.observer.assert(t, language(), &gatekeeper::Rejected {
|
||||
detail: AnyValue::symbol(detail),
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue