All notable changes to the LaunchDarkly Java SDK will be documented in this file. This project adheres to Semantic Versioning.
EventSenderinterface andEventsConfigurationBuilder.eventSender()allow you to specify a custom implementation of how event data is sent. This is mainly to facilitate testing, but could also be used to store and forward event data.
- Changed the Javadoc comments for the
LDClientconstructors to provide a better explanation of the client's initialization behavior.
- The new methods
Components.httpConfiguration()andLDConfig.Builder.http(), and the new classHttpConfigurationBuilder, provide a subcomponent configuration model that groups together HTTP-related options such asconnectTimeoutMillisandproxyHost- similar to howComponents.streamingDataSource()works for streaming-related options orComponents.sendEvents()for event-related options. The individualLDConfig.Buildermethods for those options will still work, but are deprecated and will be removed in version 5.0. EvaluationReasonnow has getter methods likegetRuleIndex()that were previously only on specific reason subclasses. The subclasses will be removed in version 5.0.
- In streaming mode, the SDK will now drop and restart the stream connection if either 1. it receives malformed data (indicating that some data may have been lost before reaching the application) or 2. you are using a database integration (a persistent feature store) and a database error happens while trying to store the received data. In both cases, the intention is to make sure updates from LaunchDarkly are not lost; restarting the connection causes LaunchDarkly to re-send the entire flag data set. This makes the Java SDK's behavior consistent with other LaunchDarkly server-side SDKs.
(Note that this means if there is a sustained database outage, you may see repeated reconnections as the SDK receives the data from LaunchDarkly again, tries to store it again, and gets another database error. Starting in version 5.0, there will be a more efficient mechanism in which the stream will only be restarted once the database becomes available again; that is not possible in this version because of limitations in the feature store interface.)
- Network errors during analytics event delivery could cause an unwanted large exception stacktrace to appear as part of the log message. This has been fixed to be consistent with the SDK's error handling in general: a brief message is logged at
ERRORorWARNlevel, and the stacktrace only appears if you have enabledDEBUGlevel.
LDConfig.BuildermethodsconnectTimeout,connectTimeoutMillis,proxyHost,proxyPort,proxyUsername,proxyPassword,sslSocketFactory,wrapperName, andwrapperVersion. UseLDConfig.Builder.http()andComponents.httpConfiguration()instead.EvaluationReasonsubclasses. Use the property getter methods onEvaluationReasoninstead.- The built-in New Relic integration will be removed in the 5.0 release. Application code is not affected by this change since the integration was entirely reflection-based and was not exposed in the public API.
- Improved the performance of the in-memory flag data store by using an immutable map that is atomically replaced on updates, so reads do not need a lock.
- Improved the performance of flag evaluations when there is a very long user target list in a feature flag or user segment, by representing the user key collection as a Set rather than a List.
- Updated OkHttp version to 3.12.10 (the latest version that still supports Java 7).
The primary purpose of this release is to introduce newer APIs for the existing SDK features, corresponding to how they will work in the upcoming 5.0 release. The corresponding older APIs are now deprecated; switching from them to the newer ones now will facilitate migrating to 5.0 in the future. See below for details.
This release also adds diagnostic reporting as described below.
Note: if you are using the LaunchDarkly Relay Proxy to forward events, update the Relay to version 5.10.0 or later before updating to this Java SDK version.
- The SDK now periodically sends diagnostic data to LaunchDarkly, describing the version and configuration of the SDK, the architecture and version of the runtime platform, and performance statistics. No credentials, hostnames, or other identifiable values are included. This behavior can be disabled with
LDConfig.Builder.diagnosticOptOut()or configured withEventProcessorBuilder.diagnosticRecordingInterval(). - Previously, most configuration options were set by setter methods in
LDConfig.Builder. These are being superseded by builders that are specific to one area of functionality: for instance,Components.streamingDataSource()andComponents.pollingDataSource()provide builders/factories that have options specific to streaming or polling, and the SDK's many options related to analytics events are now in a builder returned byComponents.sendEvents(). Using this newer API makes it clearer which options are for what, and makes it impossible to write contradictory configurations like.stream(true).pollingIntervalMillis(30000). - The component "feature store" will be renamed to "data store". The interface for this is still called
FeatureStorefor backward compatibility, butLDConfig.Buildernow has adataStoremethod. - There is a new API for specifying a persistent data store (usually a database integration). This is now done using the new method
Components.persistentDataStoreand one of the new integration factories in the new packagecom.launchdarkly.client.integrations. TheRedisclass in that package provides the Redis integration; the next releases of the Consul and DynamoDB integrations will use the same semantics. - The component "update processor" will be renamed to "data source". Applications normally do not need to use this interface except for the "file data source" testing component; the new entry point for this is
FileDataincom.launchdarkly.client.integrations. - It is now possible to specify an infinite cache TTL for persistent feature stores by setting the TTL to a negative number, in which case the persistent store will never be read unless the application restarts. Use this mode with caution as described in the comment for
PersistentDataStoreBuilder.cacheForever(). - New
LDConfig.BuildersetterswrapperName()andwrapperVersion()allow a library that uses the Java SDK to identify itself for usage data if desired.
- The Redis integration could fail to connect to Redis if the application did not explicitly specify a Redis URI. This has been fixed so it will default to
redis://localhost:6379as documented. - The
getCacheStats()method on the deprecatedRedisFeatureStoreclass was not working (the statistics were always zero). Note that in the newer persistent store API added in this version, there is now a different way to get cache statistics.
- Many
LDConfig.Buildermethods: see notes under "Added", and the per-method notes in Javadoc. RedisFeatureStoreandRedisFeatureStoreBuilderincom.launchdarkly.client: seeRedisincom.launchdarkly.client.integrations.FileComponentsincom.launchdarkly.client.files: seeFileDataincom.launchdarkly.client.integrations.FeatureStoreCacheConfig: seePersistentDataStoreBuilder.
- Flag evaluation would fail (with a NullPointerException that would be logged, but not thrown to the caller) if a flag rule used a semantic version operator and the specified user attribute did not have a string value.
- The recently-added exception property of
EvaluationReason.Errorshould not be serialized to JSON when sending reasons in analytics events, since the LaunchDarkly events service does not process that field and the serialization of an exception can be lengthy. The property is only meant for programmatic use. - The SDK now specifies a uniquely identifiable request header when sending events to LaunchDarkly to ensure that events are only processed once, even if the SDK sends them two times due to a failed initial attempt. (An earlier release note incorrectly stated that this behavior was added in 4.11.0. It is new in this release.)
- When an
EvaluationReasonindicates that flag evaluation failed due to an unexpected exception (getKind()isERROR, andEvaluationReason.Error.getErrorKind()isEXCEPTION), you can now examine the underlying exception viaEvaluationReason.Error.getException(). (#180)
- The
pom.xmldependencies were incorrectly specifyingruntimescope rather thancompile, causing problems for applications that did not have their own dependencies on Gson and SLF4J. (#151)
- Method overloads in
ArrayBuilder/ObjectBuilderto allow easily adding values as booleans, strings, etc. rather than converting them toLDValuefirst.
- The SDK now generates fewer ephemeral objects on the heap from flag evaluations, by reusing
EvaluationReasoninstances that have the same properties.
- In rare circumstances (depending on the exact data in the flag configuration, the flag's salt value, and the user properties), a percentage rollout could fail and return a default value, logging the error "Data inconsistency in feature flag ... variation/rollout object with no variation or rollout". This would happen if the user's hashed value fell exactly at the end of the last "bucket" (the last variation defined in the rollout). This has been fixed so that the user will get the last variation.
- Deprecated
LDCountryCode,LDUser.Builder.country(LDCountryCode), andLDUser.Builder.privateCountry(LDCountryCode).LDCountryCodewill be removed in the next major release, for setting thecountryuser property, applications should useLDUser.Builder.country(String)andLDUser.Builder.privateCountry(String)instead. SegmentRuleis an internal implementation class that was accidentally made public.NullUpdateProcessorshould not be referenced directly and will be non-public in the future; use the factory methods inComponentsinstead.
- Improved memory usage and performance when processing analytics events: the SDK now encodes event data to JSON directly, instead of creating intermediate objects and serializing them via reflection.
- A bug introduced in version 4.9.0 was causing event delivery to fail if a user was created with the
User(string)constructor, instead of the builder pattern.
This release adds the LDValue class (in com.launchdarkly.client.value), which is a new abstraction for all of the data types supported by the LaunchDarkly platform. Since those are the same as the JSON data types, the SDK previously used the Gson classes JsonElement, JsonObject, etc. to represent them. This caused two problems: the public APIs are dependent on Gson, and the Gson object and array types are mutable so it was possible to accidentally modify values that are being used elsewhere in the SDK.
While the SDK still uses Gson internally, all references to Gson types in the API are now deprecated in favor of equivalent APIs that use LDValue. Developers are encouraged to migrate toward these as soon as possible; the Gson classes will be removed from the API in a future major version. If you are only using primitive types (boolean, string, etc.) for your feature flags and user attributes, then no changes are required.
There are no other changes in this release.
LDValue(see above).- The new
jsonValueVariationandjsonValueVariationDetailmethods inLDClient/LDClientInterfaceare equivalent toJsonVariationandJsonVariationDetail, but useLDValue.
- In
LDClient/LDClientInterface:jsonVariation/jsonVariationDetail. UsejsonValueVariation/jsonValueVariationDetail. - In
LDClient/LDClientInterface:track(String, LDUser, JsonElement)andtrack(String, LDUser, JsonElement, double). UsetrackData(String, LDUser, LDValue)andtrackMetric(String, LDUser, LDValue, double). The names are different to avoid compile-time ambiguity since bothJsonElementandLDValueare nullable types. - In
LDUserBuilder:custom(String, JsonElement)andprivateCustom(String, JsonElement). Use theLDValueoverloads. - In
LDValue:fromJsonElement,unsafeFromJsonElement,asJsonElement,asUnsafeJsonElement. These are provided for compatibility with code that still usesJsonElement, but will be removed in a future major version.
- The NewRelic integration was broken when using the default uberjar distribution, because the SDK was calling
Class.forName()for a class name that was accidentally transformed by the Shadow plugin for Gradle. (#171) - Streaming connections were not using the proxy settings specified by
LDConfig.Builder.proxy()andLDConfig.Builder.proxyAuthenticator(). (#172) - The SDK was creating an unused
OkHttpClientinstance as part of the staticLDConfiginstance used by theLDClient(String)constructor. This has been removed. - Passing a null
sdkKeyorconfigto theLDClientconstructors would always throw aNullPointerException, but it did not have a descriptive message. These exceptions now explain which parameter was null.
- Added support for upcoming LaunchDarkly experimentation features. See
LDClient.track(String, LDUser, JsonElement, double).
- Updated documentation comment for
intVariationto clarify the existing rounding behavior for floating-point values: they are rounded toward zero.
- Fixed a race condition that could cause a
NumberFormatExceptionto be logged when delivering event data to LaunchDarkly (although the exception did not prevent the events from being delivered).
- In
RedisFeatureStoreBuilder, the new methodsdatabase,password, andtlsallow you to specify the database number, an optional password, and whether to make a secure connection to Redis. This is an alternative to specifying them as part of the Redis URI, e.g.rediss://:PASSWORD@host:port/NUMBER, which is also supported (previously, the database and password were supported in the URI, but the securerediss:scheme was not). LDConfig.Builder.sslSocketFactoryallows you to specify a custom socket factory and truststore for all HTTPS connections made by the SDK. This is for unusual cases where your Java environment does not have the proper root CA certificates to validate LaunchDarkly's certificate, or you are connecting through a secure proxy that has a self-signed certificate, and you do not want to modify Java's global truststore.
LDConfig.Builder.samplingIntervalis now deprecated. The intended use case for thesamplingIntervalfeature was to reduce analytics event network usage in high-traffic applications. This feature is being deprecated in favor of summary counters, which are meant to track all events.
- Under conditions where analytics events are being generated at an extremely high rate (for instance, if an application is evaluating a flag repeatedly in a tight loop on many threads), a thread could be blocked indefinitely within the
Variationmethods while waiting for the internal event processing logic to catch up with the backlog. The logic has been changed to drop events if necessary so threads will not be blocked (similar to how the SDK already drops events if the size of the event buffer is exceeded). If that happens, this warning message will be logged once: "Events are being produced faster than they can be processed; some events will be dropped". Under normal conditions this should never happen; this change is meant to avoid a concurrency bottleneck in applications that are already so busy that thread starvation is likely.
- The
LDConfig.BuildermethoduserKeysFlushIntervalwas mistakenly setting the value offlushIntervalinstead. (Thanks, kutsal!)
- CI tests now run against Java 8, 9, 10, and 11.
- Changed the artifact name from
com.launchdarkly:launchdarkly-clienttocom.launchdarkly:launchdarkly-java-server-sdk - Changed repository references to use the new URL
There are no other changes in this release. Substituting launchdarkly-client version 4.6.3 with launchdarkly-java-server-sdk version 4.6.4 will not affect functionality.
- The SDK uberjars contained some JSR305 annotation classes such as
javax.annotation.Nullable. These have been removed. They were not being used in the public API anyway. (#156) - If
trackoridentifyis called without a user, the SDK now logs a warning, and does not send an analytics event to LaunchDarkly (since it would not be processed without a user).
The LaunchDarkly SDK repositories are being renamed for consistency. This repository is now java-server-sdk rather than java-client.
The artifact names will also change. In the 4.6.3 release, the generated artifact was named com.launchdarkly.client:launchdarkly-client; in all future releases, it will be com.launchdarkly.client:launchdarkly-java-server-sdk.
- If an unrecoverable
java.lang.Erroris thrown within the analytics event dispatching thread, the SDK will now log the error stacktrace to the configured logger and then disable event sending, so that all further events are simply discarded. Previously, the SDK could be left in a state where application threads would continue trying to push events onto a queue that was no longer being consumed, which could block those threads. The SDK will not attempt to restart the event thread after such a failure, because anErrortypically indicates a serious problem with the application environment. - Summary event counters now use 64-bit integers instead of 32-bit, so they will not overflow if there is an extremely large volume of events.
- The SDK's CI test suite now includes running the tests in Windows.
- Fixed a potential race condition that could happen when using a DynamoDB or Consul feature store. The Redis feature store was not affected.
- The SDK jars now contain OSGi manifests which should make it possible to use them as bundles. The default jar requires Gson and SLF4J to be provided by other bundles, while the jar with the "all" classifier contains versions of Gson and SLF4J which it both exports and imports (i.e. it self-wires them, so it will use a higher version if you provide one). The "thin" jar is not recommended in an OSGi environment because it requires many dependencies which may not be available as bundles.
- There are now helper classes that make it much simpler to write a custom
FeatureStoreimplementation. See thecom.launchdarkly.client.utilspackage. The Redis feature store has been revised to use this code, although its functionality is unchanged except for the fix mentioned below. FeatureStorecaching parameters (for Redis or other databases) are now encapsulated in theFeatureStoreCacheConfigclass.
- The exponential backoff behavior when a stream connection fails has changed as follows. Previously, the backoff delay would increase for each attempt if the connection could not be made at all, or if a read timeout happened; but if a connection was made and then an error (other than a timeout) occurred, the delay would be reset to the minimum value. Now, the delay is only reset if a stream connection is made and remains open for at least a minute.
- The Redis feature store would incorrectly report that it had not been initialized, if there happened to be no feature flags in your environment at the time that it was initialized.
- The
RedisFeatureStoreBuildermethodscacheTime,refreshStaleValues, andasyncRefreshare deprecated in favor of the newcachingmethod which sets these all at once.
- Fixed a build error that caused the
com.launchdarkly.client.filespackage (the test file data source component added in v4.5.0) to be inaccessible unless you were using the "thin" jar. - Stream connection errors are now logged at
WARNlevel, rather thanERROR.
It is now possible to inject feature flags into the client from local JSON or YAML files, replacing the normal LaunchDarkly connection. This would typically be for testing purposes. See com.launchdarkly.client.files.FileComponents.
- The SDK's Maven releases had a
pom.xmlthat mistakenly referenced dependencies that are actually bundled (with shading) inside of our jar, resulting in those dependencies being redundantly downloaded and included (without shading) in the runtime classpath, which could cause conflicts. This has been fixed. (#122)
- The
allFlagsState()method now accepts a new option,FlagsStateOption.DETAILS_ONLY_FOR_TRACKED_FLAGS, which reduces the size of the JSON representation of the flag state by omitting some metadata. Specifically, it omits any data that is normally used for generating detailed evaluation events if a flag does not have event tracking or debugging turned on.
- JSON data from
allFlagsState()is now slightly smaller even if you do not use the new option described above, because it completely omits the flag property for event tracking unless that property istrue.
- Event delivery now works correctly when the events are being forwarded through a LaunchDarkly Relay Proxy.
- When evaluating a prerequisite feature flag, the analytics event for the evaluation did not include the result value if the prerequisite flag was off.
- The default Gson serialization for
LDUsernow includes all user properties. Previously, it omittedprivateAttributeNames.
- The new
LDClientmethodallFlagsState()should be used instead ofallFlags()if you are passing flag data to the front end for use with the JavaScript SDK. It preserves some flag metadata that the front end requires in order to send analytics events correctly. Versions 2.5.0 and above of the JavaScript SDK are able to use this metadata, but the output ofallFlagsState()will still work with older versions. - The
allFlagsState()method also allows you to select only client-side-enabled flags to pass to the front end, by using the optionFlagsStateOption.CLIENT_SIDE_ONLY. (#112) - The new
LDClientmethodsboolVariationDetail,intVariationDetail,doubleVariationDetail,stringVariationDetail, andjsonVariationDetailallow you to evaluate a feature flag (using the same parameters as you would forboolVariation, etc.) and receive more information about how the value was calculated. This information is returned in anEvaluationDetailobject, which contains both the result value and anEvaluationReasonwhich will tell you, for instance, if the user was individually targeted for the flag or was matched by one of the flag's rules, or if the flag returned the default value due to an error.
- Fixed a bug in
LDUser.Builderthat would throw an exception if you initialized the builder by copying an existing user, and then tried to add a custom attribute.
LDClient.allFlags()
- When logging errors related to the evaluation of a specific flag, the log message now always includes the flag key.
- Exception stacktraces are now logged only at DEBUG level. Previously, some were being logged at ERROR level.
- Should not permanently give up on posting events if the server returns a 400 error.
- Fixed a bug in the Redis store that caused an unnecessary extra Redis query (and a debug-level log message about updating a flag with the same version) after every update of a flag.
- New overloads of
LDUser.Builder.customandLDUser.Builder.privateCustomallow you to set a custom attribute value to any JSON element.
- The client now treats most HTTP 4xx errors as unrecoverable: that is, after receiving such an error, it will not make any more HTTP requests for the lifetime of the client instance, in effect taking the client offline. This is because such errors indicate either a configuration problem (invalid SDK key) or a bug, which is not likely to resolve without a restart or an upgrade. This does not apply if the error is 400, 408, 429, or any 5xx error.
- During initialization, if the client receives any of the unrecoverable errors described above, the client constructor will return immediately; previously it would continue waiting until a timeout. The
initialized()method will return false in this case.
- The new user builder methods
customValuesandprivateCustomValuesallow you to add a custom user attribute with multiple JSON values of mixed types. (#126) - The new constant
VersionedDataKind.ALLis a list of all existingVersionedDataKindinstances. This is mainly useful if you are writing a customFeatureStoreimplementation.
- To reduce the network bandwidth used for analytics events, feature request events are now sent as counters rather than individual events, and user details are now sent only at intervals rather than in each event. These behaviors can be modified through the LaunchDarkly UI and with the new configuration option
inlineUsersInEvents. For more details, see Analytics Data Stream Reference. - When sending analytics events, if there is a connection error or an HTTP 5xx response, the client will try to send the events again one more time after a one-second delay.
- The
LdClientclass is nowfinal.
- New methods on
LDConfig.Builder(updateProcessorFactory,featureStoreFactory,eventProcessorFactory) allow you to specify different implementations of each of the main client subcomponents (receiving feature state, storing feature state, and sending analytics events) for testing or for any other purpose. TheComponentsclass provides factories for all built-in implementations of these.
- The
featureStoreconfiguration method is deprecated, replaced by the new factory-based mechanism described above.
- In the Redis feature store, fixed a synchronization problem that could cause a feature flag update to be missed if several of them happened in rapid succession.
- Fixed a bug that would cause a
NullPointerExceptionwhen trying to evaluate a flag rule that contained an unknown operator type. This could happen if you started using some recently added feature flag functionality in the LaunchDarkly application but had not yet upgraded the SDK to a version that supports that feature. In this case, it should now simply treat that rule as a non-match.
- The log message "Attempted to update ... with a version that is the same or older" has been downgraded from
WARNlevel toDEBUG. It can happen frequently in normal operation when the client is in streaming mode, and is not a cause for concern.
- Improved performance when evaluating flags with custom attributes, by avoiding an unnecessary caught exception (thanks, rbalamohan).
- Support for a new LaunchDarkly feature: reusable user segments.
- The
FeatureStoreinterface has been changed to support user segment data as well as feature flags. Existing code that usesInMemoryFeatureStoreorRedisFeatureStoreshould work as before, but custom feature store implementations will need to be updated. - Removed deprecated methods.
This release was broken and should not be used.
- Improved performance when evaluating flags with custom attributes, by avoiding an unnecessary caught exception (thanks, rbalamohan).
- Adds support for a future LaunchDarkly feature, coming soon: semantic version user attributes.
- It is now possible to compute rollouts based on an integer attribute of a user, not just a string attribute.
- All threads created by the client are now daemon threads.
- Fixed a bug that could result in a previously deleted feature flag appearing to be available again.
- Reduced the logging level for use of an unknown feature flag from
WARNtoINFO.
- Support for specifying private user attributes in order to prevent user attributes from being sent in analytics events back to LaunchDarkly. See the
allAttributesPrivateandprivateAttributeNamesmethods onLDConfig.Builderas well as theprivateXmethods onLDUser.Builder.
- Added an option to disable sending analytics events
- No longer attempt to reconnect if a 401 response is received (this would indicate an invalid SDK key, so retrying won't help)
- Simplified logic to detect dropped stream connections
- Increased default polling interval to 30s
- Use flag data in redis before stream connection is established, if possible (See #107)
- Avoid creating HTTP cache when streaming mode is enabled (as it won't be useful). This makes it possible to use the SDK in Google App Engine and other environments with no mutable disk access.
- Removed GSON dependency from default jar (fixes #103)
- Only log a warning on the first event that overflows the event buffer [#102]
- Updated okhttp-eventsource dependency to 1.5.0 to pick up better connection timeout handling.
- LDUser
Builderconstructor which accepts a previously built user as an initialization parameter.
- #96
LDUsernow hasequals()andhashCode()methods
- #93
LDClientnow releases resources more quickly when shutting down
- Improved Gson compatibility (added no-args constructors for classes we deserialize)
- Automated release process
- Improved Gson compatibility (added no-args constructors for classes we deserialize)
- Automated release process
- Fixed issue where stream connection failed to fully establish
- In Java 7, connections to LaunchDarkly are now possible using TLSv1.1 and/or TLSv1.2
- The order of SSE stream events is now preserved. (launchdarkly/okhttp-eventsource#19)
- #92 Regex
matchestargeting rules now include the user if a match is found anywhere in the attribute. Before fixing this bug, the entire attribute needed to match the pattern.
- Authentication for proxied http requests is now supported (Basic Auth only)
- Improved Redis connection pool management.
- LdClientInterface (and its implementation) have a new method:
boolean isFlagKnown(String featureKey)which checks for a feature flag's existence. Thanks @yuv422!
- EventProcessor now respects the connect and socket timeouts configured with LDConfig.
- Updated okhttp-eventsource dependency to bring in newer okhttp dependency
- Added more verbose debug level logging when sending events
- StreamProcessor uses the proxy configuration specified by LDConfig.
- Better handling of null default values.
- allFlags() method on client no longer returns null when client is in offline mode.
- RedisFeatureStore: Update Jedis dependency. Improved thread/memory management.
- The StreamProcessor now listens for heartbeats from the streaming API, and will automatically reconnect if heartbeats are not received.
- Updated GSON dependency version to 2.7
- StreamingProcessor now supports increasing retry delays with jitter. Addresses [https://github.com/launchdarkly/java-server-sdk/issues/74[(https://github.com/launchdarkly/java-server-sdk/issues/74)
- Now publishing artifact with 'all' classifier that includes SLF4J for ColdFusion or other systems that need it.
- Removed slf4j from default artifact: #71
- Support for multivariate feature flags. New methods
boolVariation,jsonVariationandintVariationanddoubleVariationfor multivariates. - Added
LDClientInterface, an interface suitable for mockingLDClient.
- The
Featuredata model has been replaced withFeatureFlag.FeatureFlagis not generic. - The
allFlagsmethod now returns aMap<String, JsonElement>to support multivariate flags.
- The
togglecall has been deprecated in favor ofboolVariation.
- The
getFlagcall has been removed. - The
debugStreamingconfiguration option has been removed.