Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
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
3 changes: 3 additions & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
add_subdirectory(hello-c-client)
add_subdirectory(hello-cpp-client)
add_subdirectory(hello-cpp-server)
add_subdirectory(hello-c-server)

add_subdirectory(client-and-server-coexistence)
15 changes: 15 additions & 0 deletions examples/client-and-server-coexistence/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Required for Apple Silicon support.
cmake_minimum_required(VERSION 3.19)

project(
LaunchDarklyCClientAndServerCoexistence
VERSION 0.1
DESCRIPTION "LaunchDarkly C Client-side and Server-side SDK coexistence in same application"
LANGUAGES C
)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_executable(c-client-and-server main.c)
target_link_libraries(c-client-and-server PRIVATE launchdarkly::client launchdarkly::server launchdarkly::sse launchdarkly::common Threads::Threads)
46 changes: 46 additions & 0 deletions examples/client-and-server-coexistence/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/**
* This application intends to verify that the symbols from the
* client-side and server-side SDKs do not clash, thus enabling both SDKs to be
* used within the same application.
*/

#include <launchdarkly/client_side/bindings/c/sdk.h>
#include <launchdarkly/server_side/bindings/c/sdk.h>

#include <launchdarkly/client_side/bindings/c/config/builder.h>
#include <launchdarkly/server_side/bindings/c/config/builder.h>

#include <launchdarkly/bindings/c/context_builder.h>

int main() {
LDContextBuilder context_builder = LDContextBuilder_New();
LDContextBuilder_AddKind(context_builder, "user", "example-user-key");
LDContextBuilder_Attributes_SetName(context_builder, "user", "Sandy");
LDContext context = LDContextBuilder_Build(context_builder);

LDClientConfigBuilder client_config_builder =
LDClientConfigBuilder_New("foo");
LDClientConfig client_config = NULL;

LDStatus client_config_status =
LDClientConfigBuilder_Build(client_config_builder, &client_config);

if (LDStatus_Ok(client_config_status)) {
LDClientSDK client_sdk = LDClientSDK_New(client_config, context);
LDClientSDK_Free(client_sdk);
}

LDServerConfigBuilder server_config_builder =
LDServerConfigBuilder_New("foo");
LDServerConfig server_config = NULL;

LDStatus server_config_status =
LDServerConfigBuilder_Build(server_config_builder, &server_config);

if (LDStatus_Ok(server_config_status)) {
LDServerSDK server_sdk = LDServerSDK_New(server_config);
LDServerSDK_Free(server_sdk);
}

return 0;
}
4 changes: 2 additions & 2 deletions examples/hello-c-client/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ int main() {
LDClientConfigBuilder config_builder =
LDClientConfigBuilder_New(MOBILE_KEY);

LDClientConfig config;
LDClientConfig config = NULL;
LDStatus config_status =
LDClientConfigBuilder_Build(config_builder, &config);
if (!LDStatus_Ok(config_status)) {
Expand All @@ -44,7 +44,7 @@ int main() {

LDClientSDK client = LDClientSDK_New(config, context);

bool initialized_successfully;
bool initialized_successfully = false;
if (LDClientSDK_Start(client, INIT_TIMEOUT_MILLISECONDS,
&initialized_successfully)) {
if (initialized_successfully) {
Expand Down
15 changes: 15 additions & 0 deletions examples/hello-c-server/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Required for Apple Silicon support.
cmake_minimum_required(VERSION 3.19)

project(
LaunchDarklyHelloCServer
VERSION 0.1
DESCRIPTION "LaunchDarkly Hello C Server-side SDK"
LANGUAGES C
)

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

add_executable(hello-c-server main.c)
target_link_libraries(hello-c-server PRIVATE launchdarkly::server launchdarkly::sse launchdarkly::common Threads::Threads)
78 changes: 78 additions & 0 deletions examples/hello-c-server/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include <launchdarkly/server_side/bindings/c/config/builder.h>
#include <launchdarkly/server_side/bindings/c/sdk.h>

#include <launchdarkly/bindings/c/context_builder.h>

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Set SDK_KEY to your LaunchDarkly SKD key.
#define SDK_KEY ""

// Set FEATURE_FLAG_KEY to the feature flag key you want to evaluate.
#define FEATURE_FLAG_KEY "my-boolean-flag"

// Set INIT_TIMEOUT_MILLISECONDS to the amount of time you will wait for
// the client to become initialized.
#define INIT_TIMEOUT_MILLISECONDS 3000

int main() {
if (!strlen(SDK_KEY)) {
printf(
"*** Please edit main.c to set SDK_KEY to your LaunchDarkly "
"SDK key first\n\n");
return 1;
}

LDServerConfigBuilder config_builder = LDServerConfigBuilder_New(SDK_KEY);

LDServerConfig config = NULL;
LDStatus config_status =
LDServerConfigBuilder_Build(config_builder, &config);
if (!LDStatus_Ok(config_status)) {
printf("error: config is invalid: %s", LDStatus_Error(config_status));
return 1;
}

LDServerSDK client = LDServerSDK_New(config);

bool initialized_successfully = false;
if (LDServerSDK_Start(client, INIT_TIMEOUT_MILLISECONDS,
&initialized_successfully)) {
if (initialized_successfully) {
printf("*** SDK successfully initialized!\n\n");
} else {
printf("*** SDK failed to initialize\n");
return 1;
}
} else {
printf("SDK initialization didn't complete in %dms\n",
INIT_TIMEOUT_MILLISECONDS);
return 1;
}

LDContextBuilder context_builder = LDContextBuilder_New();
LDContextBuilder_AddKind(context_builder, "user", "example-user-key");
LDContextBuilder_Attributes_SetName(context_builder, "user", "Sandy");
LDContext context = LDContextBuilder_Build(context_builder);

bool flag_value =
LDServerSDK_BoolVariation(client, context, FEATURE_FLAG_KEY, false);

printf("*** Feature flag '%s' is %s for this user\n\n", FEATURE_FLAG_KEY,
flag_value ? "true" : "false");

// Here we ensure that the SDK shuts down cleanly and has a chance to
// deliver analytics events to LaunchDarkly before the program exits. If
// analytics events are not delivered, the user properties and flag usage
// statistics will not appear on your dashboard. In a normal long-running
// application, the SDK would continue running and events would be delivered
// automatically in the background.

LDContext_Free(context);
LDServerSDK_Free(client);

return 0;
}
12 changes: 6 additions & 6 deletions examples/hello-cpp-server/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
#include <cstring>
#include <iostream>

// Set MOBILE_KEY to your LaunchDarkly mobile key.
#define MOBILE_KEY ""
// Set SDK_KEY to your LaunchDarkly SDK key.
#define SDK_KEY ""

// Set FEATURE_FLAG_KEY to the feature flag key you want to evaluate.
#define FEATURE_FLAG_KEY "my-boolean-flag"
Expand All @@ -16,14 +16,14 @@

using namespace launchdarkly;
int main() {
if (!strlen(MOBILE_KEY)) {
if (!strlen(SDK_KEY)) {
printf(
"*** Please edit main.cpp to set MOBILE_KEY to your LaunchDarkly "
"mobile key first\n\n");
"*** Please edit main.cpp to set SDK_KEY to your LaunchDarkly "
"SDK key first\n\n");
return 1;
}

auto config = server_side::ConfigBuilder(MOBILE_KEY).Build();
auto config = server_side::ConfigBuilder(SDK_KEY).Build();
if (!config) {
std::cout << "error: config is invalid: " << config.error() << '\n';
return 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ extern "C" { // only need to export C interface if
typedef struct _LDClientConfig* LDClientConfig;

/**
* Frees an unused configuration. Configurations passed into an LDClient must
* not be be freed.
* Free an unused configuration. Configurations used to construct an LDClientSDK
* must not be be freed.
*
* @param config Config to free.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <launchdarkly/bindings/c/flag_listener.h>
#include <launchdarkly/bindings/c/listener_connection.h>
#include <launchdarkly/bindings/c/memory_routines.h>
#include <launchdarkly/bindings/c/shared_function_argument_macro_definitions.h>
#include <launchdarkly/bindings/c/status.h>
#include <launchdarkly/bindings/c/value.h>

Expand All @@ -27,9 +28,6 @@ extern "C" { // only need to export C interface if

typedef struct _LDClientSDK* LDClientSDK;

#define LD_NONBLOCKING 0
#define LD_DISCARD_DETAIL NULL

/**
* Constructs a new client-side LaunchDarkly SDK from a configuration and
* context.
Expand Down
1 change: 0 additions & 1 deletion libs/client-sdk/src/bindings/c/sdk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@ LDClientSDK_StringVariation(LDClientSDK sdk,
LD_ASSERT_NOT_NULL(flag_key);
LD_ASSERT_NOT_NULL(default_value);

// TODO: custom allocation / free routines
return strdup(
TO_SDK(sdk)->StringVariation(flag_key, default_value).c_str());
}
Expand Down
2 changes: 1 addition & 1 deletion libs/client-sdk/tests/client_c_bindings_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ TEST(ClientBindings, RegisterFlagListener) {
ASSERT_TRUE(LDStatus_Ok(status));

LDContextBuilder ctx_builder = LDContextBuilder_New();
LDContextBuilder_AddKind(ctx_builder, "`user", "shadow");
LDContextBuilder_AddKind(ctx_builder, "user", "shadow");

LDContext context = LDContextBuilder_Build(ctx_builder);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/** @file */
#pragma once

/* Function should operate asynchronously. */
#define LD_NONBLOCKING 0

/* Function should discard evaluation details. */
#define LD_DISCARD_DETAIL NULL
2 changes: 0 additions & 2 deletions libs/common/include/launchdarkly/config/client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ using SDK = config::shared::ClientSDK;
using Defaults = config::shared::Defaults<SDK>;
using AppInfoBuilder = config::shared::builders::AppInfoBuilder;
using EndpointsBuilder = config::shared::builders::EndpointsBuilder<SDK>;

using ConfigBuilder = config::shared::builders::ConfigBuilder<SDK>;

using EventsBuilder = config::shared::builders::EventsBuilder<SDK>;
using HttpPropertiesBuilder =
config::shared::builders::HttpPropertiesBuilder<SDK>;
Expand Down
1 change: 1 addition & 0 deletions libs/common/include/launchdarkly/config/server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ using EventsBuilder = config::shared::builders::EventsBuilder<SDK>;
using HttpPropertiesBuilder =
config::shared::builders::HttpPropertiesBuilder<SDK>;
using DataSourceBuilder = config::shared::builders::DataSourceBuilder<SDK>;
using LoggingBuilder = config::shared::builders::LoggingBuilder;
using PersistenceBuilder = config::shared::builders::PersistenceBuilder<SDK>;

using Config = config::Config<SDK>;
Expand Down
Loading