Skip to content

Commit 8fbd407

Browse files
refactor: rust std refactor (#29)
* refactor: bring back std * refactor: proto module * refactor: json feature * feat: non blocking aggregating resolve logger * feat: added log_assign to resolve_logger * fixup! feat: added log_assign to resolve_logger
1 parent 62a36f5 commit 8fbd407

File tree

18 files changed

+1044
-297
lines changed

18 files changed

+1044
-297
lines changed

Cargo.lock

Lines changed: 47 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

confidence-cloudflare-resolver/src/lib.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use confidence_resolver::confidence::flags::resolver::v1::events::FlagAssigned;
2-
use confidence_resolver::{confidence, FlagToApply, Host, ResolvedValue, ResolverState, Struct};
1+
use confidence_resolver::{
2+
proto::{confidence, google::Struct},
3+
FlagToApply, Host, ResolvedValue, ResolverState,
4+
};
35
use worker::*;
46

57
use base64::engine::general_purpose::STANDARD;
@@ -8,7 +10,9 @@ use bytes::Bytes;
810
use serde_json::from_slice;
911
use serde_json::json;
1012

11-
use confidence::flags::resolver::v1::{ApplyFlagsRequest, ApplyFlagsResponse, ResolveFlagsRequest};
13+
use confidence::flags::resolver::v1::{
14+
events::FlagAssigned, ApplyFlagsRequest, ApplyFlagsResponse, ResolveFlagsRequest,
15+
};
1216

1317
use confidence_resolver::Client;
1418
use once_cell::sync::Lazy;
@@ -19,8 +23,8 @@ const ACCOUNT_ID: &str = include_str!("../../data/account_id");
1923
const STATE_JSON: &[u8] = include_bytes!("../../data/resolver_state_current.pb");
2024
const ENCRYPTION_KEY_BASE64: &str = include_str!("../../data/encryption_key");
2125

22-
use confidence_resolver::confidence::flags::admin::v1::{ClientResolveInfo, FlagResolveInfo};
23-
use confidence_resolver::confidence::flags::resolver::v1::Sdk;
26+
use confidence::flags::admin::v1::{ClientResolveInfo, FlagResolveInfo};
27+
use confidence::flags::resolver::v1::Sdk;
2428
use serde::{Deserialize, Serialize};
2529
use std::sync::OnceLock;
2630

confidence-resolver/Cargo.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ publish = false
1010
crate-type = ['rlib']
1111

1212
[features]
13-
default = ["std"]
14-
std = ["chrono/clock", "rand/thread_rng", "rust-crypto-wasm", "serde", "serde_json", "pbjson", "pbjson-types"]
13+
default = ["std", "json"]
14+
std = ["chrono/clock", "rand/thread_rng", "rust-crypto-wasm"]
15+
json = ["serde", "serde_json", "pbjson", "pbjson-types"]
1516

1617
[dependencies]
1718
spin = "0.10.0"
@@ -20,12 +21,14 @@ bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] }
2021
miniz_oxide = { version = "0.8.9", default-features = false, features = ["with-alloc"] }
2122
chrono = { version = "0.4", default-features = false, features = ["alloc"] }
2223
semver = { version = "1.0.20", default-features = false }
23-
hashbrown = { version = "0.15.4" }
2424
crc32fast = { version = "1.4.2", default-features = false }
25+
crossbeam-queue = { version = "0.3.12", default-features = false, features = ["alloc"] }
2526

2627
prost = { version = "0.12", default-features = false, features = ["derive" ] }
2728
prost-types = { version = "0.12", default-features = false }
2829
bytes = { version = "1.4.0", default-features = false }
30+
papaya = "0.2.3"
31+
arc-swap = "1.7.1"
2932

3033
# Optional dependency for std
3134
rust-crypto-wasm = { version = "0.3.1", optional = true }

confidence-resolver/build.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ fn main() -> Result<()> {
3535
]
3636
.iter()
3737
.for_each(|&p| {
38-
config.type_attribute(p, "#[derive(Eq, PartialOrd, Ord)]");
38+
config.type_attribute(p, "#[derive(Eq, Hash)]");
3939
});
4040

4141
config
4242
.file_descriptor_set_path(&descriptor_path)
4343
.btree_map(["."]);
4444

45-
#[cfg(feature = "std")]
45+
#[cfg(feature = "json")]
4646
{
4747
// Override prost-types with pbjson-types when std feature is enabled
4848
config
@@ -53,7 +53,7 @@ fn main() -> Result<()> {
5353
// Generate prost structs
5454
config.compile_protos(&proto_files, &[root])?;
5555

56-
#[cfg(feature = "std")]
56+
#[cfg(feature = "json")]
5757
{
5858
// Generate pbjson serde implementations
5959
let descriptor_set = std::fs::read(&descriptor_path)?;

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

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,18 @@ import "google/protobuf/struct.proto";
77
import "google/api/annotations.proto";
88
import "google/api/field_behavior.proto";
99
import "google/api/visibility.proto";
10+
import "confidence/flags/admin/v1/types.proto";
1011

1112
import "confidence/flags/resolver/v1/types.proto";
1213
import "confidence/flags/resolver/v1/events/events.proto";
1314
import "confidence/auth/v1/auth.proto";
1415
import "confidence/api/annotations.proto";
16+
import "confidence/flags/admin/v1/events/events.proto";
1517

1618
option java_package = "com.spotify.confidence.flags.resolver.v1";
1719
option java_multiple_files = true;
1820
option java_outer_classname = "InternalApiProto";
1921

20-
// The service that allows to report flag assigned and other client-side flag
21-
// operations, useful when the resolve engine runs on the customer's premises
22-
// (e.g. side-car)
2322
service InternalFlagLoggerService {
2423
option (google.api.api_visibility).restriction = "INTERNAL";
2524

@@ -46,8 +45,48 @@ service InternalFlagLoggerService {
4645
object_field: "account"
4746
};
4847
}
48+
49+
// Writes flag assignment events and resolve logs together.
50+
// (-- api-linter: core::0136::http-uri-suffix=disabled
51+
// aip.dev/not-precedent: Disabled because the additional binding. --)
52+
rpc WriteFlagLogs(WriteFlagLogsRequest) returns (WriteFlagLogsResponse){
53+
option (google.api.http) = {
54+
post: "/v1/flagLogs:write"
55+
body: "*"
56+
};
57+
option (confidence.auth.v1.auth) = {
58+
required_permission: CREATE_FLAG_ASSIGNED
59+
allow_basic_auth: true
60+
// we use the same permission for writing both logs
61+
required_relation: "can_write_flag_assigned"
62+
object_field: "account"
63+
};
64+
}
65+
4966
}
5067

68+
// The service that allows to report flag assigned and other client-side flag
69+
// operations, useful when the resolve engine runs on the customer's premises
70+
// (e.g. side-car)
71+
message WriteFlagLogsRequest {
72+
repeated confidence.flags.resolver.v1.events.FlagAssigned flag_assigned = 1 [
73+
(google.api.field_behavior) = OPTIONAL
74+
];
75+
76+
TelemetryData telemetry_data = 2 [
77+
(google.api.field_behavior) = OPTIONAL
78+
];
79+
80+
repeated confidence.flags.admin.v1.ClientResolveInfo client_resolve_info = 3 [
81+
(google.api.field_behavior) = OPTIONAL
82+
];
83+
repeated confidence.flags.admin.v1.FlagResolveInfo flag_resolve_info = 4 [
84+
(google.api.field_behavior) = OPTIONAL
85+
];
86+
}
87+
88+
message WriteFlagLogsResponse {}
89+
5190
// A request to write flag assignments
5291
message WriteFlagAssignedRequest {
5392
// List of flag assigned events to write

confidence-resolver/src/err.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use alloc::string::{String, ToString};
21
use core::panic::Location;
32

43
/// A minimal error type suitable as a replacement for runtime panics.

0 commit comments

Comments
 (0)