Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: server-side SDK #160

Merged
merged 80 commits into from
Oct 23, 2023
Merged
Changes from 1 commit
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
c417579
feat: add server-sdk subdirectory
cwaldren-ld Jun 12, 2023
c985539
chore: move ItemDescriptor to internal library (#151)
cwaldren-ld Jun 14, 2023
420d7a2
feat: update event processor to handle context key deduplication (#150)
cwaldren-ld Jun 14, 2023
4f89b44
chore: Merge branch 'main' into server-side
kinyoklion Jun 30, 2023
dd174a2
feat: segment data model (#153)
cwaldren-ld Jun 30, 2023
4954f88
feat: flag data model (#156)
cwaldren-ld Jun 30, 2023
f38e038
Merge branch 'main' into server-side
cwaldren-ld Jul 6, 2023
09d2bd6
feat: add Flag model to SDKDataSet (#159)
cwaldren-ld Jul 6, 2023
8367305
chore: Implement architecture diagram for data store. (#161)
kinyoklion Jul 7, 2023
2781af0
fix: Add various missing headers. (#163)
kinyoklion Jul 7, 2023
90627f2
chore: Implement server data source architecture diagram. (#167)
kinyoklion Jul 11, 2023
f2d96a4
feat: Implement basic in-memory store and change handling. (#165)
kinyoklion Jul 12, 2023
3c12979
chore: Refactor to allow sharing data source status and IDataSource. …
kinyoklion Jul 12, 2023
08aaa66
feat: Implement streaming data source. (#179)
kinyoklion Jul 17, 2023
3692736
chore: Update data store updater use reference. (#181)
kinyoklion Jul 17, 2023
ceec434
Merge branch 'main' into server-side
kinyoklion Jul 17, 2023
99dea86
feat: add ContextKind type to data model (#184)
cwaldren-ld Jul 18, 2023
e5992ef
feat: evaluation engine (#183)
cwaldren-ld Jul 18, 2023
bb75d4b
feat: initial pass of server-side Client object (#176)
cwaldren-ld Jul 19, 2023
674c343
feat: Add persistent store core interface. (#187)
kinyoklion Jul 19, 2023
0ead705
fix: EvaluationStack should take ownership of key argument (#190)
cwaldren-ld Jul 19, 2023
30d2e21
feat: Add expiration tracker. (#188)
kinyoklion Jul 19, 2023
213acbd
chore: add event processor architectural diagrams (#192)
cwaldren-ld Jul 20, 2023
0b29ea2
feat: Serialize flags and segments. (#194)
kinyoklion Jul 21, 2023
1f44309
Merge branch 'main' into server-side
cwaldren-ld Aug 16, 2023
a592e87
feat: build server SDK in CI (#198)
cwaldren-ld Aug 21, 2023
275bb66
feat: hello-cpp-server (#202)
cwaldren-ld Aug 23, 2023
9b38361
feat: server-side contract tests (#197)
cwaldren-ld Aug 23, 2023
57c29d8
fix: multi-kind user segment targeting (#206)
cwaldren-ld Aug 24, 2023
ef1061e
fix: handle undefined flag variations in fallthrough (#205)
cwaldren-ld Aug 24, 2023
648e202
Merge branch 'main' into server-side
cwaldren-ld Aug 24, 2023
9edacd1
Merge branch 'main' into server-side
cwaldren-ld Aug 25, 2023
09c74dd
remove contract test branch from server.yml
cwaldren-ld Aug 25, 2023
4ccd79f
fix: refactor Variation methods for correctness & clarity (#203)
cwaldren-ld Aug 25, 2023
a7a9660
Merge branch 'main' into server-side
cwaldren-ld Aug 25, 2023
9ec37f6
refactor: push typechecking of variation methods deeper down (#216)
cwaldren-ld Aug 28, 2023
30bfed2
Merge branch 'main' into server-side
cwaldren-ld Aug 28, 2023
62cb864
Merge branch 'main' into server-side
cwaldren-ld Aug 29, 2023
66b4c83
fix: deserializing certain values leads to infinite loop (#224)
cwaldren-ld Aug 29, 2023
eb1b3ed
feat: add DataSourceStatus() and plumb through IClient interface (#217)
cwaldren-ld Aug 30, 2023
b9c03e2
Merge branch 'main' into server-side
cwaldren-ld Aug 30, 2023
371ab00
refactor: move DataSourceStatus ErrorInfo C Bindings into common (#225)
cwaldren-ld Aug 30, 2023
61ddbe7
add Doxygen config and doc.md
cwaldren-ld Aug 30, 2023
aba2473
chore: add Server-side README (#226)
cwaldren-ld Aug 31, 2023
1538a76
fix: ensure flag updates go through data store updater (#228)
cwaldren-ld Aug 31, 2023
7ab8c1d
Merge branch 'main' into server-side
cwaldren-ld Aug 31, 2023
3669ff5
feat: server-side C bindings (#210)
cwaldren-ld Aug 31, 2023
4889549
feat: plumb server side initial backoff delay (#232)
cwaldren-ld Sep 1, 2023
d0ce48d
add story label to remaining test suppressions:
cwaldren-ld Sep 1, 2023
1db6db9
chore: resolve ValidChar function lint/compile warnings (#234)
cwaldren-ld Sep 5, 2023
5f04888
Merge branch 'main' into server-side
cwaldren-ld Sep 11, 2023
fe9e559
Merge branch 'main' into server-side
cwaldren-ld Sep 14, 2023
61a3bef
use async_connect() instead of run() in streaming data source
cwaldren-ld Sep 15, 2023
ede809d
Merge branch 'main' into server-side
cwaldren-ld Oct 18, 2023
a1751f3
build: fix LD_BUILD_SHARED_LIBS flag usage
cwaldren-ld Oct 18, 2023
32fc0ce
Merge branch 'cw/fix-shared-lib-variable' into server-side
cwaldren-ld Oct 18, 2023
f4c6542
use new cmake variables
cwaldren-ld Oct 18, 2023
6e428b4
one more missing usage
cwaldren-ld Oct 18, 2023
ed49fff
Merge branch 'cw/fix-shared-lib-variable' into server-side
cwaldren-ld Oct 18, 2023
29385ec
fix merge conflicts
cwaldren-ld Oct 18, 2023
f796566
fix hello-c-server compilation
cwaldren-ld Oct 18, 2023
5eeb40e
Merge branch 'main' into server-side
cwaldren-ld Oct 19, 2023
9c9ec0b
update server github workflow to better match client's
cwaldren-ld Oct 19, 2023
7760458
remove old-style user contract test suppressions
cwaldren-ld Oct 19, 2023
b0a6885
fix: enforce validated ContextKind usage in Segment data model (#263)
cwaldren-ld Oct 20, 2023
dc14199
formatting
cwaldren-ld Oct 19, 2023
880ab16
use WriteMinimal where possible for writing JSON
cwaldren-ld Oct 20, 2023
2c494ce
clang format
cwaldren-ld Oct 20, 2023
64ab87d
remove TODO about using initial reconnect delay (implemented)
cwaldren-ld Oct 20, 2023
ce9ae07
remove/resolve some TODOs
cwaldren-ld Oct 20, 2023
e217299
Merge branch 'main' into server-side
cwaldren-ld Oct 20, 2023
a6a7456
fix client-and-server-coexistence linking
cwaldren-ld Oct 20, 2023
9597b29
update client/server readmes and put CMake options in toplevel readme
cwaldren-ld Oct 20, 2023
943d07c
revert change to client data source status state
cwaldren-ld Oct 20, 2023
8179eba
remove unused evaluation detail API & remove implicit bool operator
cwaldren-ld Oct 20, 2023
6f1aba6
Merge branch 'main' into server-side
cwaldren-ld Oct 20, 2023
1da898d
Merge branch 'main' into server-side
cwaldren-ld Oct 20, 2023
df4ef40
add some story links for todos
cwaldren-ld Oct 23, 2023
d7453d3
remove object slicing in asio_event_processor
cwaldren-ld Oct 23, 2023
17a9d38
remove useless inheritance usage in server-side events
cwaldren-ld Oct 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: add Flag model to SDKDataSet (#159)
Adds in missing `Flag` model to the top-level `SDKDataSet`.

Additionally, both the flag/segment fields now use use `PARSE_FIELD`, so
we can get an empty `unordered_map` if they are missing.
cwaldren-ld authored Jul 6, 2023
commit 09d2bd60297be74e7c2acbc598c0f4d517389a62
7 changes: 7 additions & 0 deletions libs/internal/include/launchdarkly/data_model/flag.hpp
Original file line number Diff line number Diff line change
@@ -83,5 +83,12 @@ struct Flag {
bool trackEvents;
bool trackEventsFallthrough;
std::optional<std::uint64_t> debugEventsUntilDate;

/**
* Returns the flag's version. Satisfies ItemDescriptor template
* constraints.
* @return Version of this flag.
*/
[[nodiscard]] inline std::uint64_t Version() const { return version; }
};
} // namespace launchdarkly::data_model
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <launchdarkly/data_model/flag.hpp>
#include <launchdarkly/data_model/item_descriptor.hpp>
#include <launchdarkly/data_model/segment.hpp>

@@ -14,9 +15,8 @@ namespace launchdarkly::data_model {
struct SDKDataSet {
using FlagKey = std::string;
using SegmentKey = std::string;
// std::unordered_map<FlagKey, ItemDescriptor<Flag>> flags;
std::optional<std::unordered_map<SegmentKey, ItemDescriptor<Segment>>>
segments;
std::unordered_map<FlagKey, ItemDescriptor<Flag>> flags;
std::unordered_map<SegmentKey, ItemDescriptor<Segment>> segments;
};

} // namespace launchdarkly::data_model
6 changes: 6 additions & 0 deletions libs/internal/include/launchdarkly/data_model/segment.hpp
Original file line number Diff line number Diff line change
@@ -48,6 +48,12 @@ struct Segment {

// TODO(cwaldren): make Kind a real type that is deserialized, so we can
// make empty string an error.

/**
* Returns the segment's version. Satisfies ItemDescriptor template
* constraints.
* @return Version of this segment.
*/
[[nodiscard]] inline std::uint64_t Version() const { return version; }
};
} // namespace launchdarkly::data_model
4 changes: 3 additions & 1 deletion libs/internal/src/serialization/json_sdk_data_set.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <boost/core/ignore_unused.hpp>
#include <boost/json.hpp>
#include <launchdarkly/serialization/json_flag.hpp>
#include <launchdarkly/serialization/json_item_descriptor.hpp>
#include <launchdarkly/serialization/json_sdk_data_set.hpp>
#include <launchdarkly/serialization/json_segment.hpp>
@@ -19,7 +20,8 @@ tl::expected<std::optional<data_model::SDKDataSet>, JsonError> tag_invoke(

data_model::SDKDataSet data_set;

PARSE_CONDITIONAL_FIELD(data_set.segments, obj, "segments");
PARSE_FIELD(data_set.flags, obj, "flags");
PARSE_FIELD(data_set.segments, obj, "segments");

return data_set;
}
14 changes: 11 additions & 3 deletions libs/internal/tests/data_model_serialization_test.cpp
Original file line number Diff line number Diff line change
@@ -13,7 +13,8 @@ TEST(SDKDataSetTests, DeserializesEmptyDataSet) {
boost::json::value_to<tl::expected<data_model::SDKDataSet, JsonError>>(
boost::json::parse("{}"));
ASSERT_TRUE(result);
ASSERT_FALSE(result->segments);
ASSERT_TRUE(result->segments.empty());
ASSERT_TRUE(result->flags.empty());
}

TEST(SDKDataSetTests, ErrorOnInvalidSchema) {
@@ -29,8 +30,15 @@ TEST(SDKDataSetTests, DeserializesZeroSegments) {
boost::json::value_to<tl::expected<data_model::SDKDataSet, JsonError>>(
boost::json::parse(R"({"segments":{}})"));
ASSERT_TRUE(result);
ASSERT_TRUE(result->segments);
ASSERT_TRUE(result->segments->empty());
ASSERT_TRUE(result->segments.empty());
}

TEST(SDKDataSetTests, DeserializesZeroFlags) {
auto result =
boost::json::value_to<tl::expected<data_model::SDKDataSet, JsonError>>(
boost::json::parse(R"({"flags":{}})"));
ASSERT_TRUE(result);
ASSERT_TRUE(result->flags.empty());
}

TEST(SegmentTests, DeserializesMinimumValid) {