Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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;

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;

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;
}
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;
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;
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