Skip to content

Commit feb444b

Browse files
authored
fix sticky, add log functionality (#34)
1 parent a180d2e commit feb444b

File tree

3 files changed

+61
-19
lines changed

3 files changed

+61
-19
lines changed

confidence-resolver/protos/confidence/flags/resolver/v1/wasm_api.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ message MaterializationInfo {
3737
map<string, string> rule_to_variant = 2;
3838
}
3939

40+
message LogMessage {
41+
string message = 1;
42+
}
43+
4044
message ResolveWithStickyResponse {
4145
oneof resolve_result {
4246
Success success = 1;

confidence-resolver/src/lib.rs

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
// clippy::integer_arithmetic
77
))]
88

9-
use core::marker::PhantomData;
10-
use std::collections::{HashMap, HashSet};
11-
129
use bitvec::prelude as bv;
10+
use core::marker::PhantomData;
1311
use fastmurmur3::murmur3_x64_128;
12+
use std::collections::{HashMap, HashSet};
13+
use std::fmt::format;
1414

1515
use bytes::Bytes;
1616

@@ -227,6 +227,10 @@ pub trait Host {
227227
Alphanumeric.sample_string(&mut rand::rng(), len)
228228
}
229229

230+
fn log(_: &str) {
231+
// noop
232+
}
233+
230234
#[cfg(not(feature = "std"))]
231235
fn current_time() -> Timestamp;
232236
#[cfg(feature = "std")]
@@ -512,7 +516,9 @@ impl<'a, H: Host> AccountResolver<'a, H> {
512516

513517
let mut resolve_results = Vec::with_capacity(flags_to_resolve.len());
514518

515-
for flag in flags_to_resolve {
519+
let mut has_missing_materializations = false;
520+
521+
for flag in flags_to_resolve.clone() {
516522
let resolve_result = self.resolve_flag(flag, request.materialization_context.clone());
517523
match resolve_result {
518524
Ok(resolve_result) => resolve_results.push(resolve_result),
@@ -526,22 +532,26 @@ impl<'a, H: Host> AccountResolver<'a, H> {
526532
vec![],
527533
))
528534
} else {
529-
let deps = self.collect_missing_materializations(&flag);
530-
match deps {
531-
Ok(deps) => Ok(
532-
ResolveWithStickyResponse::with_missing_materializations(
533-
deps,
534-
),
535-
),
536-
Err(err) => Err(err),
537-
}
535+
has_missing_materializations = true;
536+
break;
538537
}
539538
}
540539
};
541540
}
542541
}
543542
}
544543

544+
if has_missing_materializations {
545+
let result = self.collect_missing_materializations(flags_to_resolve);
546+
if let Ok(missing) = result {
547+
return Ok(ResolveWithStickyResponse::with_missing_materializations(
548+
missing,
549+
));
550+
} else {
551+
return Err("Could not collect missing materializations".to_string());
552+
}
553+
}
554+
545555
let resolved_values: Vec<ResolvedValue> = resolve_results
546556
.iter()
547557
.map(|r| r.resolved_value.clone())
@@ -726,6 +736,27 @@ impl<'a, H: Host> AccountResolver<'a, H> {
726736
}
727737

728738
pub fn collect_missing_materializations(
739+
&'a self,
740+
flags: Vec<&'a Flag>,
741+
) -> Result<Vec<resolve_with_sticky_response::MissingMaterializationItem>, String> {
742+
let mut missing_materializations: Vec<
743+
resolve_with_sticky_response::MissingMaterializationItem,
744+
> = Vec::new();
745+
for flag in flags {
746+
let result = self.collect_missing_materializations_for_flag(flag);
747+
if let Ok(items) = result {
748+
missing_materializations.extend(items);
749+
} else {
750+
return Err(format!(
751+
"Could not collect missing materializations for flag {}",
752+
flag.name
753+
));
754+
}
755+
}
756+
Ok(missing_materializations)
757+
}
758+
759+
fn collect_missing_materializations_for_flag(
729760
&'a self,
730761
flag: &'a Flag,
731762
) -> Result<Vec<resolve_with_sticky_response::MissingMaterializationItem>, String> {
@@ -767,7 +798,6 @@ impl<'a, H: Host> AccountResolver<'a, H> {
767798
}
768799
}
769800
}
770-
771801
Ok(missing_materializations)
772802
}
773803

wasm/rust-guest/src/lib.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use prost::Message;
1010
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
1111

1212
use confidence_resolver::proto::confidence::flags::resolver::v1::{
13-
ResolveWithStickyRequest, WriteFlagLogsRequest,
13+
LogMessage, ResolveWithStickyRequest, WriteFlagLogsRequest,
1414
};
1515
use confidence_resolver::resolve_logger::ResolveLogger;
1616
use rand::distr::Alphanumeric;
@@ -124,6 +124,17 @@ fn converted_client(client: &Client) -> crate::proto::Client {
124124
struct WasmHost;
125125

126126
impl Host for WasmHost {
127+
fn random_alphanumeric(len: usize) -> String {
128+
RNG.with_borrow_mut(|rng| Alphanumeric.sample_string(rng, len))
129+
}
130+
131+
fn log(message: &str) {
132+
log_message(LogMessage {
133+
message: message.to_string(),
134+
})
135+
.unwrap();
136+
}
137+
127138
fn current_time() -> Timestamp {
128139
current_time(Void {}).unwrap()
129140
}
@@ -160,10 +171,6 @@ impl Host for WasmHost {
160171
fn decrypt_resolve_token(token_data: &[u8], _encryption_key: &[u8]) -> Result<Vec<u8>, String> {
161172
Ok(token_data.to_vec())
162173
}
163-
164-
fn random_alphanumeric(len: usize) -> String {
165-
RNG.with_borrow_mut(|rng| Alphanumeric.sample_string(rng, len))
166-
}
167174
}
168175

169176
/// Safely gets an owned handle to the current resolver state.
@@ -215,5 +222,6 @@ wasm_msg_guest! {
215222

216223
// Declare the add function as a host function
217224
wasm_msg_host! {
225+
fn log_message(message: LogMessage) -> WasmResult<Void>;
218226
fn current_time(request: Void) -> WasmResult<Timestamp>;
219227
}

0 commit comments

Comments
 (0)