From bec604e5f9871caa6885e47e1666bff04689683b Mon Sep 17 00:00:00 2001 From: Jim Anderson Date: Fri, 15 Aug 2025 14:07:06 -0500 Subject: [PATCH 1/2] release: v0.9.0 --- CHANGELOG.md | 27 +++++++++---------- README.md | 12 ++++----- build.gradle | 2 +- example/example1/build.gradle | 2 +- publish.gradle | 2 +- .../sdk/api/configuration/Configuration.java | 4 +-- .../api/configuration/ConfigurationTest.java | 2 +- 7 files changed, 25 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa95d99f..ff415a96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,30 @@ # Changelog -## [Unreleased](https://github.com/openfga/java-sdk/compare/v0.8.3...HEAD) +## [Unreleased](https://github.com/openfga/java-sdk/compare/v0.9.0...HEAD) + +## v0.9.0 + +### [0.9.0](https://github.com/openfga/java-sdk/compare/v0.8.3...v0.9.0) (2025-08-15) ### Added -- feat: RFC 9110 compliant Retry-After header support with exponential backoff and jitter -- feat: Enhanced retry strategy with delay calculation -- feat: Retry-After header value exposed in error objects for better observability -- feat: Input validation for Configuration.minimumRetryDelay() to prevent negative values -- feat: Default value (100ms) now explicitly set for minimumRetryDelay configuration +- RFC 9110 compliant `Retry-After` header support with exponential backoff and jitter +- `Retry-After` header value exposed in error objects for better observability +- `FgaError` now exposes `Retry-After` header value via `getRetryAfterHeader()` method ### Changed +- Enhanced retry strategy with delay calculation - **BREAKING**: Maximum allowable retry count is now enforced at 15 (default remains 3) -- **BREAKING**: FgaError now exposes Retry-After header value via getRetryAfterHeader() method - **BREAKING**: Configuration.minimumRetryDelay() now requires non-null values and validates input, throwing IllegalArgumentException for null or negative values -### Technical Details -- Implements RFC 9110 compliant Retry-After header parsing (supports both integer seconds and HTTP-date formats) -- Adds exponential backoff with jitter (base delay: 2^retryCount * 100ms, capped at 120 seconds) -- Validates Retry-After values between 1-1800 seconds (30 minutes maximum) -- Prioritizes Retry-After header delays over exponential backoff when present -- Unified retry behavior: All requests retry on 429s and 5xx errors (except 501 Not Implemented) - **Migration Guide**: - Update error handling code if using FgaError properties - new getRetryAfterHeader() method available - Note: Maximum allowable retries is now enforced at 15 (validation added to prevent exceeding this limit) - **IMPORTANT**: Configuration.minimumRetryDelay() now requires non-null values and validates input - ensure you're not passing null or negative Duration values, as this will now throw IllegalArgumentException. Previously null values were silently accepted and would fall back to default behavior at runtime. +### Fixed +- Fixed issue where telemetry metrics are not being exported correctly [#590](https://github.com/openfga/sdk-generator/pull/590) +- Fixed issue with non-transactional write error handling [https://github.com/openfga/sdk-generator/pull/573](https://github.com/openfga/sdk-generator/pull/573) + ## v0.8.3 ### [0.8.3](https://github.com/openfga/java-sdk/compare/v0.8.2...v0.8.3) (2025-07-15) diff --git a/README.md b/README.md index 83ac871e..42c3c884 100644 --- a/README.md +++ b/README.md @@ -79,13 +79,13 @@ It can be used with the following: * Gradle (Groovy) ```groovy -implementation 'dev.openfga:openfga-sdk:0.8.3' +implementation 'dev.openfga:openfga-sdk:0.9.0' ``` * Gradle (Kotlin) ```kotlin -implementation("dev.openfga:openfga-sdk:0.8.3") +implementation("dev.openfga:openfga-sdk:0.9.0") ``` * Apache Maven @@ -94,26 +94,26 @@ implementation("dev.openfga:openfga-sdk:0.8.3") dev.openfga openfga-sdk - 0.8.3 + 0.9.0 ``` * Ivy ```xml - + ``` * SBT ```scala -libraryDependencies += "dev.openfga" % "openfga-sdk" % "0.8.3" +libraryDependencies += "dev.openfga" % "openfga-sdk" % "0.9.0" ``` * Leiningen ```edn -[dev.openfga/openfga-sdk "0.8.3"] +[dev.openfga/openfga-sdk "0.9.0"] ``` diff --git a/build.gradle b/build.gradle index ed6519a9..ccc38869 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ plugins { apply from: 'publish.gradle' group = 'dev.openfga' -version = '0.8.3' +version = '0.9.0' repositories { mavenCentral() diff --git a/example/example1/build.gradle b/example/example1/build.gradle index bf5e67b0..78f15a80 100644 --- a/example/example1/build.gradle +++ b/example/example1/build.gradle @@ -23,7 +23,7 @@ ext { } dependencies { - implementation("dev.openfga:openfga-sdk:0.8.3") + implementation("dev.openfga:openfga-sdk:0.9.0") // Serialization implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") diff --git a/publish.gradle b/publish.gradle index a7274735..517929cc 100644 --- a/publish.gradle +++ b/publish.gradle @@ -6,7 +6,7 @@ publishing { pom { group = 'dev.openfga' name = 'openfga-sdk' - version = '0.8.3' + version = '0.9.0' description = 'This is an autogenerated Java SDK for OpenFGA. It provides a wrapper around the [OpenFGA API definition](https://openfga.dev/api).' url = 'https://openfga.dev' licenses { diff --git a/src/main/java/dev/openfga/sdk/api/configuration/Configuration.java b/src/main/java/dev/openfga/sdk/api/configuration/Configuration.java index fd8c894c..8c518389 100644 --- a/src/main/java/dev/openfga/sdk/api/configuration/Configuration.java +++ b/src/main/java/dev/openfga/sdk/api/configuration/Configuration.java @@ -30,10 +30,10 @@ * Configurations for an api client. */ public class Configuration implements BaseConfiguration { - public static final String VERSION = "0.8.3"; + public static final String VERSION = "0.9.0"; private static final String DEFAULT_API_URL = "http://localhost:8080"; - private static final String DEFAULT_USER_AGENT = "openfga-sdk java/0.8.3"; + private static final String DEFAULT_USER_AGENT = "openfga-sdk java/0.9.0"; private static final Duration DEFAULT_READ_TIMEOUT = Duration.ofSeconds(10); private static final Duration DEFAULT_CONNECT_TIMEOUT = Duration.ofSeconds(10); private static final int DEFAULT_MAX_RETRIES = 3; diff --git a/src/test/java/dev/openfga/sdk/api/configuration/ConfigurationTest.java b/src/test/java/dev/openfga/sdk/api/configuration/ConfigurationTest.java index b1d7dece..3b70ed63 100644 --- a/src/test/java/dev/openfga/sdk/api/configuration/ConfigurationTest.java +++ b/src/test/java/dev/openfga/sdk/api/configuration/ConfigurationTest.java @@ -22,7 +22,7 @@ class ConfigurationTest { private static final String DEFAULT_API_URL = "http://localhost:8080"; - private static final String DEFAULT_USER_AGENT = "openfga-sdk java/0.8.3"; + private static final String DEFAULT_USER_AGENT = "openfga-sdk java/0.9.0"; private static final Duration DEFAULT_READ_TIMEOUT = Duration.ofSeconds(10); private static final Duration DEFAULT_CONNECT_TIMEOUT = Duration.ofSeconds(10); private static final Map DEFAULT_HEADERS = Map.of(); From 051279b7c5efd41d816d96da6660ff5432fddb56 Mon Sep 17 00:00:00 2001 From: Jim Anderson Date: Fri, 15 Aug 2025 14:45:20 -0500 Subject: [PATCH 2/2] review: fix min retry delay readme example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42c3c884..7a74b91c 100644 --- a/README.md +++ b/README.md @@ -1001,7 +1001,7 @@ public class Example { .storeId(System.getenv("FGA_STORE_ID")) // Not required when calling createStore() or listStores() .authorizationModelId(System.getenv("FGA_MODEL_ID")) // Optional, can be overridden per request .maxRetries(3) // retry up to 3 times on API requests (default: 3, maximum: 15) - .minimumRetryDelay(100); // minimum wait time between retries in milliseconds (default: 100ms) + .minimumRetryDelay(Duration.ofMillis(100)); // minimum wait time between retries in milliseconds (default: 100ms) var fgaClient = new OpenFgaClient(config); var response = fgaClient.readAuthorizationModels().get();