Skip to content

Commit e92733d

Browse files
authored
feat: change engine proxy to use flatbuffer implementation over wasm (#333)
1 parent 47632de commit e92733d

File tree

30 files changed

+326
-241
lines changed

30 files changed

+326
-241
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@ target
4646
**/bin/
4747
.vim/
4848
*.versionsBackup
49+
mise.toml

benches/jmh/unleash-client-benches/pom.xml

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,3 @@
1-
<!--
2-
Copyright (c) 2014, Oracle America, Inc.
3-
All rights reserved.
4-
5-
Redistribution and use in source and binary forms, with or without
6-
modification, are permitted provided that the following conditions are met:
7-
8-
* Redistributions of source code must retain the above copyright notice,
9-
this list of conditions and the following disclaimer.
10-
11-
* Redistributions in binary form must reproduce the above copyright
12-
notice, this list of conditions and the following disclaimer in the
13-
documentation and/or other materials provided with the distribution.
14-
15-
* Neither the name of Oracle nor the names of its contributors may be used
16-
to endorse or promote products derived from this software without
17-
specific prior written permission.
18-
19-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22-
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23-
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24-
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25-
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26-
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27-
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28-
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29-
THE POSSIBILITY OF SUCH DAMAGE.
30-
-->
31-
321
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
332
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
343
<modelVersion>4.0.0</modelVersion>

benches/jmh/unleash-client-benches/src/main/java/io/getunleash/UnleashClientBenchmark.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public void isEnabledWithContext(MyState myState, Blackhole bh) {
5656
bh.consume(myState.unleash.isEnabled("Test.impressionDataPresent", myState.context));
5757
}
5858

59+
5960
@Benchmark
6061
public void getDefaultVariant(MyState myState, Blackhole bh) {
6162
bh.consume(myState.unleash.getVariant("Test.impressionDataPresent"));

examples/cli-example/build.gradle.kts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
java
33
application
4+
id("com.google.cloud.tools.jib").version("3.4.5")
45
}
56

67
application {
@@ -12,7 +13,36 @@ repositories {
1213
mavenLocal()
1314
}
1415

16+
java {
17+
targetCompatibility = JavaVersion.VERSION_25
18+
sourceCompatibility = JavaVersion.VERSION_25
19+
}
20+
21+
jib {
22+
container {
23+
mainClass = "io.getunleash.example.AdvancedConstraints"
24+
}
25+
from {
26+
image = "gcr.io/distroless/java25-debian13:latest"
27+
platforms {
28+
platform {
29+
architecture = "amd64"
30+
os = "linux"
31+
}
32+
platform {
33+
architecture = "arm64"
34+
os = "linux"
35+
}
36+
}
37+
}
38+
}
39+
1540
dependencies {
16-
implementation("io.getunleash:unleash-client-java:11.1.0")
17-
implementation("ch.qos.logback:logback-classic:1.4.12")
41+
implementation("io.getunleash:unleash-client-java:11.2.0-SNAPSHOT")
42+
implementation("org.slf4j:slf4j-api:2.0.17")
43+
runtimeOnly("org.apache.logging.log4j:log4j-core:2.25.2")
44+
runtimeOnly("org.apache.logging.log4j:log4j-api:2.25.2")
45+
runtimeOnly("org.apache.logging.log4j:log4j-slf4j2-impl:2.25.2")
46+
runtimeOnly("org.apache.logging.log4j:log4j-layout-template-json:2.25.2")
47+
runtimeOnly("com.fasterxml.jackson.core:jackson-databind:2.20.1")
1848
}
-15.9 KB
Binary file not shown.

examples/cli-example/gradlew

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
# See the License for the specific language governing permissions and
1616
# limitations under the License.
1717
#
18+
# SPDX-License-Identifier: Apache-2.0
19+
#
1820

1921
##############################################################################
2022
#
@@ -55,7 +57,7 @@
5557
# Darwin, MinGW, and NonStop.
5658
#
5759
# (3) This script is generated from the Groovy template
58-
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
60+
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
5961
# within the Gradle project.
6062
#
6163
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,13 +82,11 @@ do
8082
esac
8183
done
8284

83-
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84-
85-
APP_NAME="Gradle"
85+
# This is normally unused
86+
# shellcheck disable=SC2034
8687
APP_BASE_NAME=${0##*/}
87-
88-
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89-
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
88+
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89+
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
9090

9191
# Use the maximum available, or set MAX_FD != -1 to use that value.
9292
MAX_FD=maximum
@@ -133,22 +133,29 @@ location of your Java installation."
133133
fi
134134
else
135135
JAVACMD=java
136-
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
136+
if ! command -v java >/dev/null 2>&1
137+
then
138+
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137139
138140
Please set the JAVA_HOME variable in your environment to match the
139141
location of your Java installation."
142+
fi
140143
fi
141144

142145
# Increase the maximum file descriptors if we can.
143146
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144147
case $MAX_FD in #(
145148
max*)
149+
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
150+
# shellcheck disable=SC2039,SC3045
146151
MAX_FD=$( ulimit -H -n ) ||
147152
warn "Could not query maximum file descriptor limit"
148153
esac
149154
case $MAX_FD in #(
150155
'' | soft) :;; #(
151156
*)
157+
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
158+
# shellcheck disable=SC2039,SC3045
152159
ulimit -n "$MAX_FD" ||
153160
warn "Could not set maximum file descriptor limit to $MAX_FD"
154161
esac
@@ -193,18 +200,28 @@ if "$cygwin" || "$msys" ; then
193200
done
194201
fi
195202

196-
# Collect all arguments for the java command;
197-
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198-
# shell script including quotes and variable substitutions, so put them in
199-
# double quotes to make sure that they get re-expanded; and
200-
# * put everything else in single quotes, so that it's not re-expanded.
203+
204+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
205+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
206+
207+
# Collect all arguments for the java command:
208+
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
209+
# and any embedded shellness will be escaped.
210+
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
211+
# treated as '${Hostname}' itself on the command line.
201212

202213
set -- \
203214
"-Dorg.gradle.appname=$APP_BASE_NAME" \
204215
-classpath "$CLASSPATH" \
205216
org.gradle.wrapper.GradleWrapperMain \
206217
"$@"
207218

219+
# Stop when "xargs" is not available.
220+
if ! command -v xargs >/dev/null 2>&1
221+
then
222+
die "xargs is not available"
223+
fi
224+
208225
# Use "xargs" to parse quoted args.
209226
#
210227
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.

examples/cli-example/gradlew.bat

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
@rem See the License for the specific language governing permissions and
1414
@rem limitations under the License.
1515
@rem
16+
@rem SPDX-License-Identifier: Apache-2.0
17+
@rem
1618

17-
@if "%DEBUG%" == "" @echo off
19+
@if "%DEBUG%"=="" @echo off
1820
@rem ##########################################################################
1921
@rem
2022
@rem Gradle startup script for Windows
@@ -25,7 +27,8 @@
2527
if "%OS%"=="Windows_NT" setlocal
2628

2729
set DIRNAME=%~dp0
28-
if "%DIRNAME%" == "" set DIRNAME=.
30+
if "%DIRNAME%"=="" set DIRNAME=.
31+
@rem This is normally unused
2932
set APP_BASE_NAME=%~n0
3033
set APP_HOME=%DIRNAME%
3134

@@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
4043

4144
set JAVA_EXE=java.exe
4245
%JAVA_EXE% -version >NUL 2>&1
43-
if "%ERRORLEVEL%" == "0" goto execute
46+
if %ERRORLEVEL% equ 0 goto execute
4447

45-
echo.
46-
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47-
echo.
48-
echo Please set the JAVA_HOME variable in your environment to match the
49-
echo location of your Java installation.
48+
echo. 1>&2
49+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
50+
echo. 1>&2
51+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
52+
echo location of your Java installation. 1>&2
5053

5154
goto fail
5255

@@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
5659

5760
if exist "%JAVA_EXE%" goto execute
5861

59-
echo.
60-
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61-
echo.
62-
echo Please set the JAVA_HOME variable in your environment to match the
63-
echo location of your Java installation.
62+
echo. 1>&2
63+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
64+
echo. 1>&2
65+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
66+
echo location of your Java installation. 1>&2
6467

6568
goto fail
6669

@@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
7578

7679
:end
7780
@rem End local scope for the variables with windows NT shell
78-
if "%ERRORLEVEL%"=="0" goto mainEnd
81+
if %ERRORLEVEL% equ 0 goto mainEnd
7982

8083
:fail
8184
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
8285
rem the _cmd.exe /c_ return code!
83-
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84-
exit /b 1
86+
set EXIT_CODE=%ERRORLEVEL%
87+
if %EXIT_CODE% equ 0 set EXIT_CODE=1
88+
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
89+
exit /b %EXIT_CODE%
8590

8691
:mainEnd
8792
if "%OS%"=="Windows_NT" endlocal

examples/cli-example/src/main/java/io/getunleash/example/AdvancedConstraints.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,36 @@
44
import io.getunleash.Unleash;
55
import io.getunleash.UnleashContext;
66
import io.getunleash.util.UnleashConfig;
7-
import io.getunleash.event.UnleashReady;
8-
import io.getunleash.event.ClientFeaturesResponse;
9-
import io.getunleash.event.UnleashSubscriber;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
109

1110
public class AdvancedConstraints {
11+
private static final Logger LOGGER = LoggerFactory.getLogger(AdvancedConstraints.class);
1212

1313
public static void main(String[] args) throws InterruptedException {
14+
String callsPerSecondStr = getOrElse("UNLEASH_RPS", "5");
15+
Integer callsPerSecond = Integer.parseInt(callsPerSecondStr);
16+
int sleepInterval = (int) ((1.0 / callsPerSecond) * 1000.0);
17+
String apiToken = getOrElse("UNLEASH_API_TOKEN",
18+
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349");
19+
String apiUrl = getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api");
1420
UnleashConfig config = UnleashConfig.builder()
15-
.appName("client-example.advanced.java")
16-
.customHttpHeader(
17-
"Authorization",
18-
getOrElse("UNLEASH_API_TOKEN",
19-
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349"))
20-
.unleashAPI(getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api"))
21-
.instanceId("java-example")
22-
.synchronousFetchOnInitialisation(true)
23-
.subscriber(new UnleashSubscriber() {
24-
public void onReady(UnleashReady ready) {
25-
System.out.println("Unleash is ready");
26-
}
27-
public void togglesFetched(ClientFeaturesResponse toggleResponse) {
28-
System.out.println("Fetch toggles with status: " + toggleResponse.getStatus());
29-
}
30-
})
31-
.sendMetricsInterval(30).build();
32-
33-
Unleash unleash = new DefaultUnleash(config);
34-
UnleashContext context = UnleashContext.builder()
35-
.addProperty("semver", "1.5.2")
36-
.build();
37-
UnleashContext smallerSemver = UnleashContext.builder()
38-
.addProperty("semver", "1.1.0")
21+
.appName("client-example.advanced.java")
22+
.customHttpHeader(
23+
"Authorization",
24+
apiToken)
25+
.unleashAPI(apiUrl)
26+
.instanceId("java-example")
27+
.synchronousFetchOnInitialisation(true)
3928
.build();
29+
LOGGER.info("Connecting to {}, evaluating at {} rps ({} ms interval)",apiUrl, callsPerSecond, sleepInterval);
30+
Unleash unleash = new DefaultUnleash(config);
4031
while (true) {
41-
unleash.isEnabled("advanced.constraints", context); // expect this to be true
42-
unleash.isEnabled("advanced.constraints", smallerSemver); // expect this to be false
32+
var results = unleash.more().evaluateAllToggles();
33+
var toggle = unleash.isEnabled("openai.chat");
34+
var variant = unleash.getVariant("openai.chat");
35+
LOGGER.info("Got {} toggles and openai.chat enabled {}, variant name: {}, featureEnabled was {} for openai.chat. sleeping {}ms", results.size(), toggle, variant.getName(), variant.isFeatureEnabled(), sleepInterval);
36+
Thread.sleep(sleepInterval);
4337
}
4438
}
4539

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.getunleash.example;
2+
3+
import io.getunleash.DefaultUnleash;
4+
import io.getunleash.Unleash;
5+
import io.getunleash.UnleashContext;
6+
import io.getunleash.util.UnleashConfig;
7+
8+
import static io.getunleash.example.AdvancedConstraints.getOrElse;
9+
10+
public class GetVariant {
11+
public static void main(String[] args) throws InterruptedException {
12+
UnleashConfig config = UnleashConfig.builder()
13+
.appName("client-example.advanced.java")
14+
.customHttpHeader(
15+
"Authorization",
16+
getOrElse("UNLEASH_API_TOKEN",
17+
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349"))
18+
.unleashAPI(getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api"))
19+
.instanceId("java-example")
20+
.synchronousFetchOnInitialisation(true)
21+
.sendMetricsInterval(30).build();
22+
Unleash unleash = new DefaultUnleash(config);
23+
UnleashContext context = UnleashContext.builder()
24+
.addProperty("semver", "1.5.2")
25+
.build();
26+
UnleashContext smallerSemver = UnleashContext.builder()
27+
.addProperty("semver", "1.1.0")
28+
.build();
29+
while (true) {
30+
unleash.getVariant("advanced.constraints"); // expect this to be true
31+
unleash.getVariant("advanced.constraints", smallerSemver); // expect this to be false
32+
Thread.sleep(1);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)