diff --git a/README.md b/README.md index 1115420..1687ab1 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Patch-based fork of [temporalio/sdk-java](https://github.com/temporalio/sdk-java |-------|-------------| | 0001 | Replace Jackson with Moshi as default JSON converter | | 0002 | Remove GSON dependency | -| 0003 | Replace grpc-netty-shaded with grpc-okhttp | +| 0003 | Replace grpc-netty-shaded with grpc-netty (real, un-shaded) | | 0004 | Change groupId to `com.pkware.temporal` | ## Maven coordinates diff --git a/patches/0003-Replace-grpc-netty-shaded-with-grpc-netty.patch b/patches/0003-Replace-grpc-netty-shaded-with-grpc-netty.patch new file mode 100644 index 0000000..55904e2 --- /dev/null +++ b/patches/0003-Replace-grpc-netty-shaded-with-grpc-netty.patch @@ -0,0 +1,1269 @@ +From 4b542cdcdaf56ab9e5d6e96f07c6d8bb14eae106 Mon Sep 17 00:00:00 2001 +From: Marius Volkhart +Date: Thu, 25 Jun 2026 12:18:14 -0400 +Subject: [PATCH] Replace grpc-netty-shaded with grpc-netty + +Compile against real io.grpc:grpc-netty instead of the vendored shaded +copy so consuming applications control a single Netty version on their +classpath. Real grpc-netty exposes the same GrpcSslContexts/SslContext +APIs as the shaded variant, so this is a package-prefix de-shade +(io.grpc.netty.shaded.io.netty.* -> io.netty.*) rather than a rewrite; +the affected files revert to upstream form. Also de-shades the +temporal-envconfig sources and the native-image metadata in +temporal-serviceclient and temporal-test-server. +--- + .../envconfig/ClientConfigProfile.java | 6 +- + .../envconfig/ClientConfigProfileTest.java | 2 +- + temporal-serviceclient/build.gradle | 2 +- + .../serviceclient/ChannelManager.java | 2 +- + .../serviceclient/ServiceStubsOptions.java | 9 +- + .../SimpleSslContextBuilder.java | 8 +- + .../native-image.properties | 12 +- + .../reflect-config.json | 202 +++++++------- + .../resource-config.json | 2 +- + .../reachability-metadata.json | 250 +++++++++--------- + 10 files changed, 247 insertions(+), 248 deletions(-) + +diff --git a/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfigProfile.java b/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfigProfile.java +index 3257fbf..3db5b8f 100644 +--- a/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfigProfile.java ++++ b/temporal-envconfig/src/main/java/io/temporal/envconfig/ClientConfigProfile.java +@@ -1,9 +1,9 @@ + package io.temporal.envconfig; + + import io.grpc.Metadata; +-import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts; +-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder; +-import io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory; ++import io.grpc.netty.GrpcSslContexts; ++import io.netty.handler.ssl.SslContextBuilder; ++import io.netty.handler.ssl.util.InsecureTrustManagerFactory; + import io.temporal.client.WorkflowClientOptions; + import io.temporal.serviceclient.WorkflowServiceStubsOptions; + import java.io.ByteArrayInputStream; +diff --git a/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java b/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java +index da4cc86..79572d2 100644 +--- a/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java ++++ b/temporal-envconfig/src/test/java/io/temporal/envconfig/ClientConfigProfileTest.java +@@ -3,7 +3,7 @@ package io.temporal.envconfig; + import com.google.common.collect.ImmutableMap; + import com.google.common.io.Files; + import io.grpc.Metadata; +-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; ++import io.netty.handler.ssl.SslContext; + import io.temporal.serviceclient.WorkflowServiceStubsOptions; + import java.io.*; + import java.nio.charset.StandardCharsets; +diff --git a/temporal-serviceclient/build.gradle b/temporal-serviceclient/build.gradle +index 1da1e24..9e0633c 100644 +--- a/temporal-serviceclient/build.gradle ++++ b/temporal-serviceclient/build.gradle +@@ -11,7 +11,7 @@ dependencies { + + api ("io.grpc:grpc-api") //Classes like io.grpc.Metadata are used as a part of our API + api "io.grpc:grpc-stub" //Part of WorkflowServiceStubs API +- api "io.grpc:grpc-netty-shaded" //Part of WorkflowServiceStubs API, specifically SslContext ++ api "io.grpc:grpc-netty" //Part of WorkflowServiceStubs API, specifically SslContext + api "io.grpc:grpc-protobuf" //For io.grpc.protobuf.StatusProto and ProtoUtils used by generated stubs + api "io.grpc:grpc-services" //Standard gRPC HealthCheck Response class + api "io.grpc:grpc-inprocess" //For the in-process time skipping test server +diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java +index da39c74..b1b6f40 100644 +--- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java ++++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java +@@ -5,7 +5,7 @@ import io.grpc.*; + import io.grpc.health.v1.HealthCheckRequest; + import io.grpc.health.v1.HealthCheckResponse; + import io.grpc.health.v1.HealthGrpc; +-import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder; ++import io.grpc.netty.NettyChannelBuilder; + import io.grpc.stub.MetadataUtils; + import io.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities; + import io.temporal.internal.retryer.GrpcRetryer; +diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java +index 0c3d8ae..8b156e7 100644 +--- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java ++++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java +@@ -4,7 +4,7 @@ import com.google.common.base.MoreObjects; + import com.uber.m3.tally.NoopScope; + import com.uber.m3.tally.Scope; + import io.grpc.*; +-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; ++import io.netty.handler.ssl.SslContext; + import io.temporal.authorization.AuthorizationGrpcMetadataProvider; + import io.temporal.authorization.AuthorizationTokenSupplier; + import java.time.Duration; +@@ -510,7 +510,7 @@ public class ServiceStubsOptions { + /** + * Gives an opportunity to provide some additional configuration to the channel builder or + * override configurations done by the Temporal Stubs. Currently, Temporal Stubs use {@link +- * io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder} to create a {@link ManagedChannel}. ++ * io.grpc.netty.NettyChannelBuilder} to create a {@link ManagedChannel}. + * + *

Advanced API + * +@@ -518,9 +518,8 @@ public class ServiceStubsOptions { + * + * @param channelInitializer listener that will be called as a last step of channel creation if + * Stubs are configured with {@link Builder#setTarget(String)}. The listener is called with +- * an instance of {@link io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder} that will +- * be used by Temporal Stubs to create a {@link ManagedChannel}. The builder type may change +- * in the future. ++ * an instance of {@link io.grpc.netty.NettyChannelBuilder} that will be used by Temporal ++ * Stubs to create a {@link ManagedChannel}. The builder type may change in the future. + * @return {@code this} + */ + public T setChannelInitializer(Consumer> channelInitializer) { +diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java +index cabc70c..d14c471 100644 +--- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java ++++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java +@@ -1,9 +1,9 @@ + package io.temporal.serviceclient; + +-import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts; +-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; +-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder; +-import io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory; ++import io.grpc.netty.GrpcSslContexts; ++import io.netty.handler.ssl.SslContext; ++import io.netty.handler.ssl.SslContextBuilder; ++import io.netty.handler.ssl.util.InsecureTrustManagerFactory; + import java.io.InputStream; + import java.security.KeyStore; + import java.security.KeyStoreException; +diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties +index 4b61f30..888d59b 100644 +--- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties ++++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties +@@ -20,12 +20,12 @@ + + Args = --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder \ + --initialize-at-build-time=org.slf4j.LoggerFactory \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.channel.epoll \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.channel.unix \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.internal.logging.Slf4JLoggerFactory$NopInstanceHolder \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.internal.logging.Log4JLogger \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.internal.tcnative \ +- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl \ ++ --initialize-at-run-time=io.netty.channel.epoll \ ++ --initialize-at-run-time=io.netty.channel.unix \ ++ --initialize-at-run-time=io.netty.util.internal.logging.Slf4JLoggerFactory$NopInstanceHolder \ ++ --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger \ ++ --initialize-at-run-time=io.netty.internal.tcnative \ ++ --initialize-at-run-time=io.netty.handler.ssl \ + -H:DynamicProxyConfigurationResources=${.}/proxy-config.json \ + -H:JNIConfigurationResources=${.}/jni-config.json \ + -H:ReflectionConfigurationResources=${.}/reflect-config.json \ +diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json +index 44fa4dc..0ff016c 100644 +--- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json ++++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json +@@ -138,200 +138,200 @@ + "name":"io.grpc.internal.PickFirstLoadBalancerProvider" + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.AbstractNettyHandler", ++ "name":"io.grpc.netty.AbstractNettyHandler", + "methods":[ +- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } ++ {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler", ++ "name":"io.grpc.netty.NettyClientHandler", + "methods":[ +- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } ++ {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$GrpcNegotiationHandler", +- "methods":[{"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] ++ "name":"io.grpc.netty.ProtocolNegotiators$GrpcNegotiationHandler", ++ "methods":[{"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler", +- "methods":[{"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] ++ "name":"io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler", ++ "methods":[{"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$WaitUntilActiveHandler", +- "methods":[{"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }] ++ "name":"io.grpc.netty.ProtocolNegotiators$WaitUntilActiveHandler", ++ "methods":[{"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }] + }, + { +- "name":"io.grpc.netty.shaded.io.grpc.netty.WriteBufferingAndExceptionHandler", ++ "name":"io.grpc.netty.WriteBufferingAndExceptionHandler", + "methods":[ +- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, +- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } ++ {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, ++ {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator", ++ "name":"io.netty.buffer.AbstractByteBufAllocator", + "allDeclaredMethods":true + }, + { +- "name":"io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf", ++ "name":"io.netty.buffer.AbstractReferenceCountedByteBuf", + "fields":[{"name":"refCnt"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelDuplexHandler", ++ "name":"io.netty.channel.ChannelDuplexHandler", + "methods":[ +- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } ++ {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelInboundHandlerAdapter", ++ "name":"io.netty.channel.ChannelInboundHandlerAdapter", + "methods":[ +- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, +- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } ++ {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, ++ {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelInitializer", ++ "name":"io.netty.channel.ChannelInitializer", + "methods":[ +- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } ++ {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext", ++ "name":"io.netty.channel.DefaultChannelPipeline$HeadContext", + "methods":[ +- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, +- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } ++ {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"close","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, ++ {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"write","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object","io.netty.channel.ChannelPromise"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$TailContext", ++ "name":"io.netty.channel.DefaultChannelPipeline$TailContext", + "methods":[ +- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, +- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } ++ {"name":"channelActive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelInactive","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelRegistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelUnregistered","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"exceptionCaught","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, ++ {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultFileRegion" ++ "name":"io.netty.channel.DefaultFileRegion" + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.Epoll", ++ "name":"io.netty.channel.epoll.Epoll", + "methods":[{"name":"isAvailable","parameterTypes":[] }] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoopGroup", ++ "name":"io.netty.channel.epoll.EpollEventLoopGroup", + "methods":[{"name":"","parameterTypes":["int","java.util.concurrent.ThreadFactory"] }] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket" ++ "name":"io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket" + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel", ++ "name":"io.netty.channel.socket.nio.NioSocketChannel", + "methods":[{"name":"","parameterTypes":[] }] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.unix.PeerCredentials" ++ "name":"io.netty.channel.unix.PeerCredentials" + }, + { +- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.EpollSocketChannel" ++ "name":"io.netty.channel.epoll.EpollSocketChannel" + }, + { +- "name":"io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder", ++ "name":"io.netty.handler.codec.ByteToMessageDecoder", + "methods":[ +- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, +- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } ++ {"name":"channelRead","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, ++ {"name":"userEventTriggered","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.lang.Object"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler", ++ "name":"io.netty.handler.codec.http2.Http2ConnectionHandler", + "methods":[ +- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, +- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, +- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] } ++ {"name":"bind","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"channelReadComplete","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"channelWritabilityChanged","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"connect","parameterTypes":["io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.netty.channel.ChannelPromise"] }, ++ {"name":"deregister","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"disconnect","parameterTypes":["io.netty.channel.ChannelHandlerContext","io.netty.channel.ChannelPromise"] }, ++ {"name":"flush","parameterTypes":["io.netty.channel.ChannelHandlerContext"] }, ++ {"name":"read","parameterTypes":["io.netty.channel.ChannelHandlerContext"] } + ] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted", ++ "name":"io.netty.util.AbstractReferenceCounted", + "fields":[{"name":"refCnt"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil", ++ "name":"io.netty.util.ReferenceCountUtil", + "allDeclaredMethods":true + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.NativeLibraryUtil", ++ "name":"io.netty.util.internal.NativeLibraryUtil", + "methods":[{"name":"loadLibrary","parameterTypes":["java.lang.String","boolean"] }] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields":[{"name":"producerLimit"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields":[{"name":"consumerIndex"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields":[{"name":"producerIndex"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", + "fields":[{"name":"consumerIndex"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", + "fields":[{"name":"producerIndex"}] + }, + { +- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", ++ "name":"io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", + "fields":[{"name":"producerLimit"}] + }, + { +diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json +index a260699..b6c925c 100644 +--- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json ++++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json +@@ -1,7 +1,7 @@ + { + "resources":{ + "includes":[ +- {"pattern":"\\QMETA-INF/native/libio_grpc_netty_shaded_netty_transport_native_epoll_x86_64.so\\E"}, ++ {"pattern":"\\QMETA-INF/native/libnetty_transport_native_epoll_x86_64.so\\E"}, + {"pattern":"\\QMETA-INF/services/io.grpc.LoadBalancerProvider\\E"}, + {"pattern":"\\QMETA-INF/services/io.grpc.NameResolverProvider\\E"}, + {"pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E"}, +diff --git a/temporal-test-server/src/main/resources/META-INF/native-image/io.temporal/temporal-test-server/reachability-metadata.json b/temporal-test-server/src/main/resources/META-INF/native-image/io.temporal/temporal-test-server/reachability-metadata.json +index 5a618cf..6105ae1 100644 +--- a/temporal-test-server/src/main/resources/META-INF/native-image/io.temporal/temporal-test-server/reachability-metadata.json ++++ b/temporal-test-server/src/main/resources/META-INF/native-image/io.temporal/temporal-test-server/reachability-metadata.json +@@ -285,172 +285,172 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.AbstractNettyHandler", ++ "type": "io.grpc.netty.AbstractNettyHandler", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.NettyServer$1" ++ "type": "io.grpc.netty.NettyServer$1" + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.NettyServerHandler", ++ "type": "io.grpc.netty.NettyServerHandler", + "methods": [ + { + "name": "channelInactive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "close", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "write", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$GrpcNegotiationHandler", ++ "type": "io.grpc.netty.ProtocolNegotiators$GrpcNegotiationHandler", + "methods": [ + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler", ++ "type": "io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler", + "methods": [ + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$WaitUntilActiveHandler", ++ "type": "io.grpc.netty.ProtocolNegotiators$WaitUntilActiveHandler", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.UdsNameResolverProvider" ++ "type": "io.grpc.netty.UdsNameResolverProvider" + }, + { +- "type": "io.grpc.netty.shaded.io.grpc.netty.WriteBufferingAndExceptionHandler", ++ "type": "io.grpc.netty.WriteBufferingAndExceptionHandler", + "methods": [ + { + "name": "channelInactive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "close", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "connect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "flush", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "write", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.bootstrap.ServerBootstrap$1" ++ "type": "io.netty.bootstrap.ServerBootstrap$1" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor", ++ "type": "io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor", + "methods": [ + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator" ++ "type": "io.netty.buffer.AbstractByteBufAllocator" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf", ++ "type": "io.netty.buffer.AbstractReferenceCountedByteBuf", + "fields": [ + { + "name": "refCnt" +@@ -458,335 +458,335 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.ChannelDuplexHandler", ++ "type": "io.netty.channel.ChannelDuplexHandler", + "methods": [ + { + "name": "bind", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "close", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "connect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "deregister", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "disconnect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "flush", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "read", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "write", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.ChannelInboundHandlerAdapter", ++ "type": "io.netty.channel.ChannelInboundHandlerAdapter", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.ChannelInitializer", ++ "type": "io.netty.channel.ChannelInitializer", + "methods": [ + { + "name": "channelRegistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext", ++ "type": "io.netty.channel.DefaultChannelPipeline$HeadContext", + "methods": [ + { + "name": "bind", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "channelActive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "close", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "connect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "deregister", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "disconnect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "flush", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "read", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "write", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$TailContext", ++ "type": "io.netty.channel.DefaultChannelPipeline$TailContext", + "methods": [ + { + "name": "channelActive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelInactive", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelRegistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelUnregistered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "exceptionCaught", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Throwable" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.DefaultFileRegion" ++ "type": "io.netty.channel.DefaultFileRegion" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.epoll.Epoll", ++ "type": "io.netty.channel.epoll.Epoll", + "methods": [ + { + "name": "isAvailable", +@@ -799,7 +799,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.epoll.EpollServerSocketChannel", ++ "type": "io.netty.channel.epoll.EpollServerSocketChannel", + "methods": [ + { + "name": "", +@@ -808,92 +808,92 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket" ++ "type": "io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.channel.unix.PeerCredentials" ++ "type": "io.netty.channel.unix.PeerCredentials" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder", ++ "type": "io.netty.handler.codec.ByteToMessageDecoder", + "methods": [ + { + "name": "channelRead", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + }, + { + "name": "userEventTriggered", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.lang.Object" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler", ++ "type": "io.netty.handler.codec.http2.Http2ConnectionHandler", + "methods": [ + { + "name": "bind", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "channelReadComplete", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "channelWritabilityChanged", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "connect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelHandlerContext", + "java.net.SocketAddress", + "java.net.SocketAddress", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "deregister", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "disconnect", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext", +- "io.grpc.netty.shaded.io.netty.channel.ChannelPromise" ++ "io.netty.channel.ChannelHandlerContext", ++ "io.netty.channel.ChannelPromise" + ] + }, + { + "name": "flush", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + }, + { + "name": "read", + "parameterTypes": [ +- "io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext" ++ "io.netty.channel.ChannelHandlerContext" + ] + } + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted", ++ "type": "io.netty.util.AbstractReferenceCounted", + "fields": [ + { + "name": "refCnt" +@@ -901,10 +901,10 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil" ++ "type": "io.netty.util.ReferenceCountUtil" + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", + "fields": [ + { + "name": "producerLimit" +@@ -912,7 +912,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", + "fields": [ + { + "name": "consumerIndex" +@@ -920,7 +920,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", + "fields": [ + { + "name": "producerIndex" +@@ -928,7 +928,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", + "fields": [ + { + "name": "consumerIndex" +@@ -936,7 +936,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", + "fields": [ + { + "name": "producerIndex" +@@ -944,7 +944,7 @@ + ] + }, + { +- "type": "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", ++ "type": "io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", + "fields": [ + { + "name": "producerLimit" +-- +2.50.1 (Apple Git-155) + diff --git a/patches/0003-Replace-grpc-netty-shaded-with-grpc-okhttp.patch b/patches/0003-Replace-grpc-netty-shaded-with-grpc-okhttp.patch deleted file mode 100644 index 3687f15..0000000 --- a/patches/0003-Replace-grpc-netty-shaded-with-grpc-okhttp.patch +++ /dev/null @@ -1,751 +0,0 @@ -From 1a2b0df1ceeab5ec197dba2ef2be3e926054acdf Mon Sep 17 00:00:00 2001 -From: Marius Volkhart -Date: Thu, 21 May 2026 14:53:32 -0400 -Subject: [PATCH] Replace grpc-netty-shaded with grpc-okhttp - -Swap Netty channel builder for OkHttp. Rewrite SimpleSslContextBuilder -to use javax.net.ssl.SSLContext instead of Netty's SslContext. Remove -Netty-specific native image config entries. ---- - .../internal/common/ShadingHelpers.java | 5 +- - temporal-serviceclient/build.gradle | 2 +- - .../serviceclient/ChannelManager.java | 10 +- - .../serviceclient/ServiceStubsOptions.java | 25 ++- - .../SimpleSslContextBuilder.java | 191 +++++++++++------ - .../native-image.properties | 8 +- - .../reflect-config.json | 197 ------------------ - .../resource-config.json | 1 - - .../SimpleSslContextBuilderTest.java | 11 +- - 9 files changed, 158 insertions(+), 292 deletions(-) - -diff --git a/temporal-sdk/src/main/java/io/temporal/internal/common/ShadingHelpers.java b/temporal-sdk/src/main/java/io/temporal/internal/common/ShadingHelpers.java -index ca7262a..0f1bef5 100644 ---- a/temporal-sdk/src/main/java/io/temporal/internal/common/ShadingHelpers.java -+++ b/temporal-sdk/src/main/java/io/temporal/internal/common/ShadingHelpers.java -@@ -2,7 +2,8 @@ package io.temporal.internal.common; - - import io.temporal.serviceclient.ServiceStubsOptions; - import io.temporal.serviceclient.SimpleSslContextBuilder; --import javax.net.ssl.SSLException; -+import java.io.IOException; -+import java.security.GeneralSecurityException; - - /** - * This class provides shading-safe utils that don't return classes that we relocate during shading -@@ -14,7 +15,7 @@ public final class ShadingHelpers { - - public static void buildSslContextAndPublishIntoStubOptions( - SimpleSslContextBuilder sslContextBuilder, ServiceStubsOptions.Builder optionsBuilder) -- throws SSLException { -+ throws GeneralSecurityException, IOException { - optionsBuilder.setSslContext(sslContextBuilder.build()); - } - } -diff --git a/temporal-serviceclient/build.gradle b/temporal-serviceclient/build.gradle -index 1da1e24..48b17b9 100644 ---- a/temporal-serviceclient/build.gradle -+++ b/temporal-serviceclient/build.gradle -@@ -11,7 +11,7 @@ dependencies { - - api ("io.grpc:grpc-api") //Classes like io.grpc.Metadata are used as a part of our API - api "io.grpc:grpc-stub" //Part of WorkflowServiceStubs API -- api "io.grpc:grpc-netty-shaded" //Part of WorkflowServiceStubs API, specifically SslContext -+ api "io.grpc:grpc-okhttp" - api "io.grpc:grpc-protobuf" //For io.grpc.protobuf.StatusProto and ProtoUtils used by generated stubs - api "io.grpc:grpc-services" //Standard gRPC HealthCheck Response class - api "io.grpc:grpc-inprocess" //For the in-process time skipping test server -diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java -index da39c74..a4e5ab7 100644 ---- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java -+++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ChannelManager.java -@@ -5,7 +5,7 @@ import io.grpc.*; - import io.grpc.health.v1.HealthCheckRequest; - import io.grpc.health.v1.HealthCheckResponse; - import io.grpc.health.v1.HealthGrpc; --import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder; -+import io.grpc.okhttp.OkHttpChannelBuilder; - import io.grpc.stub.MetadataUtils; - import io.temporal.api.workflowservice.v1.GetSystemInfoResponse.Capabilities; - import io.temporal.internal.retryer.GrpcRetryer; -@@ -186,8 +186,8 @@ final class ChannelManager { - } - - private ManagedChannel prepareChannel() { -- NettyChannelBuilder builder = -- NettyChannelBuilder.forTarget(options.getTarget()) -+ OkHttpChannelBuilder builder = -+ OkHttpChannelBuilder.forTarget(options.getTarget()) - .defaultLoadBalancingPolicy("round_robin") - .maxInboundMessageSize(MAX_INBOUND_MESSAGE_SIZE) - .maxInboundMetadataSize(MAX_INBOUND_METADATA_SIZE); -@@ -201,7 +201,7 @@ final class ChannelManager { - if (options.getSslContext() == null && !options.getEnableHttps()) { - builder.usePlaintext(); - } else if (options.getSslContext() != null) { -- builder.sslContext(options.getSslContext()); -+ builder.sslSocketFactory(options.getSslContext().getSocketFactory()); - } else { - builder.useTransportSecurity(); - } -@@ -223,7 +223,7 @@ final class ChannelManager { - } - - private void initConnectionManagement() { -- // Currently, it is impossible to modify backoff policy on NettyChannelBuilder. -+ // Currently, it is impossible to modify backoff policy on OkHttpChannelBuilder. - // For this reason we reset connection backoff every few seconds in order to limit maximum - // retry interval, which by default equals to 2 minutes. - // Once https://github.com/grpc/grpc-java/issues/7456 is done we should be able to define -diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java -index 0c3d8ae..6edde8d 100644 ---- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java -+++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/ServiceStubsOptions.java -@@ -4,7 +4,6 @@ import com.google.common.base.MoreObjects; - import com.uber.m3.tally.NoopScope; - import com.uber.m3.tally.Scope; - import io.grpc.*; --import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; - import io.temporal.authorization.AuthorizationGrpcMetadataProvider; - import io.temporal.authorization.AuthorizationTokenSupplier; - import java.time.Duration; -@@ -15,6 +14,7 @@ import java.util.Objects; - import java.util.function.Consumer; - import javax.annotation.Nonnull; - import javax.annotation.Nullable; -+import javax.net.ssl.SSLContext; - - public class ServiceStubsOptions { - public static final String DEFAULT_LOCAL_DOCKER_TARGET = "127.0.0.1:7233"; -@@ -49,7 +49,7 @@ public class ServiceStubsOptions { - protected final boolean apiKeyProvided; - - /** The user provided context for SSL/TLS over gRPC * */ -- protected final SslContext sslContext; -+ protected final SSLContext sslContext; - - /** - * HealthCheckAttemptTimeout specifies how to long to wait for service response on each health -@@ -143,7 +143,7 @@ public class ServiceStubsOptions { - @Nullable Consumer> channelInitializer, - Boolean enableHttps, - boolean apiKeyProvided, -- SslContext sslContext, -+ SSLContext sslContext, - Duration healthCheckAttemptTimeout, - Duration healthCheckTimeout, - Duration systemInfoTimeout, -@@ -234,7 +234,7 @@ public class ServiceStubsOptions { - /** - * @return the gRPC SSL Context to use - */ -- public SslContext getSslContext() { -+ public SSLContext getSslContext() { - return sslContext; - } - -@@ -441,7 +441,7 @@ public class ServiceStubsOptions { - - public static class Builder> { - private ManagedChannel channel; -- private SslContext sslContext; -+ private SSLContext sslContext; - private Boolean enableHttps; - private String target; - private Consumer> channelInitializer; -@@ -510,7 +510,7 @@ public class ServiceStubsOptions { - /** - * Gives an opportunity to provide some additional configuration to the channel builder or - * override configurations done by the Temporal Stubs. Currently, Temporal Stubs use {@link -- * io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder} to create a {@link ManagedChannel}. -+ * io.grpc.okhttp.OkHttpChannelBuilder} to create a {@link ManagedChannel}. - * - *

Advanced API - * -@@ -518,9 +518,8 @@ public class ServiceStubsOptions { - * - * @param channelInitializer listener that will be called as a last step of channel creation if - * Stubs are configured with {@link Builder#setTarget(String)}. The listener is called with -- * an instance of {@link io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder} that will -- * be used by Temporal Stubs to create a {@link ManagedChannel}. The builder type may change -- * in the future. -+ * an instance of {@link io.grpc.okhttp.OkHttpChannelBuilder} that will be used by Temporal -+ * Stubs to create a {@link ManagedChannel}. The builder type may change in the future. - * @return {@code this} - */ - public T setChannelInitializer(Consumer> channelInitializer) { -@@ -540,7 +539,7 @@ public class ServiceStubsOptions { - * improperly. - * - *

Mutually exclusive with {@link #setTarget(String)}, {@link -- * #setChannelInitializer(Consumer)}, {@link #setSslContext(SslContext)}, {@link -+ * #setChannelInitializer(Consumer)}, {@link #setSslContext(SSLContext)}, {@link - * #setGrpcReconnectFrequency(Duration)} and {@link - * #setConnectionBackoffResetFrequency(Duration)}. These options are ignored if the custom - * channel is supplied. -@@ -555,12 +554,12 @@ public class ServiceStubsOptions { - /** - * Sets gRPC SSL Context to use, used for more advanced scenarios such as mTLS. Supersedes - * enableHttps; Exclusive with channel. Consider using {@link SimpleSslContextBuilder} which -- * greatly simplifies creation of the TLS enabled SslContext with client and server key -+ * greatly simplifies creation of the TLS enabled SSLContext with client and server key - * validation. - * - * @return {@code this} - */ -- public T setSslContext(SslContext sslContext) { -+ public T setSslContext(SSLContext sslContext) { - this.sslContext = sslContext; - return self(); - } -@@ -569,7 +568,7 @@ public class ServiceStubsOptions { - * Sets option to enable SSL/TLS/HTTPS for gRPC. - * - *

Mutually exclusive with channel; Ignored and assumed {@code true} if {@link -- * #setSslContext(SslContext)} is specified. -+ * #setSslContext(SSLContext)} is specified. - * - * @return {@code this} - */ -diff --git a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java -index cabc70c..7c9acca 100644 ---- a/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java -+++ b/temporal-serviceclient/src/main/java/io/temporal/serviceclient/SimpleSslContextBuilder.java -@@ -1,14 +1,17 @@ - package io.temporal.serviceclient; - --import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts; --import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; --import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder; --import io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory; --import java.io.InputStream; --import java.security.KeyStore; --import java.security.KeyStoreException; --import java.security.NoSuchAlgorithmException; -+import java.io.*; -+import java.security.*; -+import java.security.cert.CertificateException; -+import java.security.cert.CertificateFactory; -+import java.security.cert.X509Certificate; -+import java.security.spec.InvalidKeySpecException; -+import java.security.spec.PKCS8EncodedKeySpec; -+import java.util.ArrayList; -+import java.util.Base64; -+import java.util.List; - import javax.annotation.Nullable; -+import javax.crypto.EncryptedPrivateKeyInfo; - import javax.net.ssl.*; - - public class SimpleSslContextBuilder { -@@ -69,59 +72,50 @@ public class SimpleSslContextBuilder { - } - - /** -- * Configures specified {@link SslContextBuilder} from the Builder parameters and for use with -- * Temporal GRPC server. {@link SslContext} built by the configured builder can be used with -- * {@link WorkflowServiceStubsOptions.Builder#setSslContext(SslContext)} -+ * Builds a {@link SSLContext} configured for use with Temporal gRPC server. - * - *

If trust manager is set then it will be used to verify server authority, otherwise system - * default trust manager (or if {@link #useInsecureTrustManager} is set then insecure trust - * manager) is going to be used. - * -- * @return {@code sslContextBuilder} -- * @throws SSLException when it was unable to build the context -+ * @return {@link SSLContext} that can be used with {@link -+ * WorkflowServiceStubsOptions.Builder#setSslContext(SSLContext)} -+ * @throws GeneralSecurityException if SSL context creation fails -+ * @throws IOException if reading key or certificate streams fails - */ -- public SslContextBuilder configure(SslContextBuilder sslContextBuilder) throws SSLException { -+ public SSLContext build() throws GeneralSecurityException, IOException { - if (trustManager != null && useInsecureTrustManager) - throw new IllegalArgumentException( - "Can not use insecure trust manager if custom trust manager is set."); -- GrpcSslContexts.configure(sslContextBuilder); -- sslContextBuilder.trustManager( -- trustManager != null -- ? trustManager -- : useInsecureTrustManager -- ? InsecureTrustManagerFactory.INSTANCE.getTrustManagers()[0] -- : getDefaultTrustManager()); - -+ TrustManager[] tms; -+ if (trustManager != null) { -+ tms = new TrustManager[] {trustManager}; -+ } else if (useInsecureTrustManager) { -+ tms = new TrustManager[] {new InsecureX509TrustManager()}; -+ } else { -+ tms = null; // use JDK defaults -+ } -+ -+ KeyManager[] kms = null; - if (pkcs != null && (key != null || keyCertChain != null)) { -+ KeyManagerFactory kmf; - switch (pkcs) { - case PKCS_8: -- // netty by default supports PKCS8 -- sslContextBuilder.keyManager(keyCertChain, key, keyPassword); -+ kmf = createPKCS8KeyManager(); - break; - case PKCS_12: -- sslContextBuilder.keyManager(createPKCS12KeyManager()); -+ kmf = createPKCS12KeyManager(); - break; - default: - throw new IllegalArgumentException("PKCS " + pkcs + " is not implemented"); - } -+ kms = kmf.getKeyManagers(); - } -- return sslContextBuilder; -- } - -- /** -- * Configures {@link SslContext} from the Builder parameters and for use with Temporal GRPC -- * server. -- * -- *

If trust manager is set then it will be used to verify server authority, otherwise system -- * default trust manager (or if {@link #useInsecureTrustManager} is set then insecure trust -- * manager) is going to be used. -- * -- * @return {@link SslContext} that can be used with the {@link -- * WorkflowServiceStubsOptions.Builder#setSslContext(SslContext)} -- * @throws SSLException when it was unable to build the context -- */ -- public SslContext build() throws SSLException { -- return configure(SslContextBuilder.forClient()).build(); -+ SSLContext sslContext = SSLContext.getInstance("TLS"); -+ sslContext.init(kms, tms, null); -+ return sslContext; - } - - /** -@@ -154,6 +148,26 @@ public class SimpleSslContextBuilder { - return this; - } - -+ private KeyManagerFactory createPKCS8KeyManager() throws GeneralSecurityException, IOException { -+ if (keyCertChain == null || key == null) { -+ throw new IllegalArgumentException("PKCS8 requires both certificate chain and key"); -+ } -+ -+ CertificateFactory cf = CertificateFactory.getInstance("X.509"); -+ X509Certificate[] certs = loadCertificates(cf, keyCertChain); -+ -+ PrivateKey privateKey = loadPemPrivateKey(key, keyPassword); -+ -+ KeyStore ks = KeyStore.getInstance("PKCS12"); -+ ks.load(null, null); -+ char[] pw = keyPassword != null ? keyPassword.toCharArray() : new char[0]; -+ ks.setKeyEntry("key", privateKey, pw, certs); -+ -+ KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); -+ kmf.init(ks, pw); -+ return kmf; -+ } -+ - private KeyManagerFactory createPKCS12KeyManager() { - char[] passwordChars = keyPassword != null ? keyPassword.toCharArray() : null; - try { -@@ -168,30 +182,87 @@ public class SimpleSslContextBuilder { - } - } - -- /** -- * @return system default trust manager. -- * @throws UnknownDefaultTrustManagerException, which can be caused by {@link -- * NoSuchAlgorithmException} if {@link TrustManagerFactory#getInstance(String)} doesn't -- * support default algorithm, {@link KeyStoreException} in case if {@link KeyStore} -- * initialization failed or if no {@link X509TrustManager} has been found. -- */ -- private X509TrustManager getDefaultTrustManager() { -- TrustManagerFactory tmf; -- try { -- tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); -- // Using null here initialises the TMF with the default trust store. -- tmf.init((KeyStore) null); -- } catch (KeyStoreException | NoSuchAlgorithmException e) { -- throw new UnknownDefaultTrustManagerException(e); -+ private static X509Certificate[] loadCertificates(CertificateFactory cf, InputStream certStream) -+ throws CertificateException { -+ List certs = new ArrayList<>(); -+ for (java.security.cert.Certificate cert : cf.generateCertificates(certStream)) { -+ certs.add((X509Certificate) cert); -+ } -+ return certs.toArray(new X509Certificate[0]); -+ } -+ -+ private static PrivateKey loadPemPrivateKey(InputStream keyStream, @Nullable String password) -+ throws IOException, GeneralSecurityException { -+ String pem; -+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(keyStream))) { -+ StringBuilder sb = new StringBuilder(); -+ String line; -+ while ((line = reader.readLine()) != null) { -+ sb.append(line).append('\n'); -+ } -+ pem = sb.toString(); - } - -- for (TrustManager tm : tmf.getTrustManagers()) { -- if (tm instanceof X509TrustManager) { -- return (X509TrustManager) tm; -+ if (pem.contains("ENCRYPTED PRIVATE KEY")) { -+ return loadEncryptedPemKey(pem, password); -+ } -+ -+ String base64 = -+ pem.replace("-----BEGIN PRIVATE KEY-----", "") -+ .replace("-----END PRIVATE KEY-----", "") -+ .replace("-----BEGIN RSA PRIVATE KEY-----", "") -+ .replace("-----END RSA PRIVATE KEY-----", "") -+ .replaceAll("\\s", ""); -+ byte[] der = Base64.getDecoder().decode(base64); -+ -+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(der); -+ try { -+ return KeyFactory.getInstance("RSA").generatePrivate(keySpec); -+ } catch (InvalidKeySpecException e) { -+ try { -+ return KeyFactory.getInstance("EC").generatePrivate(keySpec); -+ } catch (InvalidKeySpecException e2) { -+ throw new InvalidKeySpecException("Key is neither RSA nor EC in PKCS#8 format", e2); - } - } -- throw new UnknownDefaultTrustManagerException( -- "Unable to find X509TrustManager in the list of default trust managers."); -+ } -+ -+ private static PrivateKey loadEncryptedPemKey(String pem, @Nullable String password) -+ throws GeneralSecurityException, IOException { -+ if (password == null) { -+ throw new IllegalArgumentException("Encrypted PKCS#8 key requires a password"); -+ } -+ String base64 = -+ pem.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "") -+ .replace("-----END ENCRYPTED PRIVATE KEY-----", "") -+ .replaceAll("\\s", ""); -+ byte[] der = Base64.getDecoder().decode(base64); -+ EncryptedPrivateKeyInfo encryptedInfo = new EncryptedPrivateKeyInfo(der); -+ javax.crypto.SecretKeyFactory skf = -+ javax.crypto.SecretKeyFactory.getInstance(encryptedInfo.getAlgName()); -+ javax.crypto.SecretKey secretKey = -+ skf.generateSecret(new javax.crypto.spec.PBEKeySpec(password.toCharArray())); -+ javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(encryptedInfo.getAlgName()); -+ cipher.init(javax.crypto.Cipher.DECRYPT_MODE, secretKey, encryptedInfo.getAlgParameters()); -+ PKCS8EncodedKeySpec keySpec = encryptedInfo.getKeySpec(cipher); -+ try { -+ return KeyFactory.getInstance("RSA").generatePrivate(keySpec); -+ } catch (InvalidKeySpecException e) { -+ return KeyFactory.getInstance("EC").generatePrivate(keySpec); -+ } -+ } -+ -+ private static class InsecureX509TrustManager implements X509TrustManager { -+ @Override -+ public void checkClientTrusted(X509Certificate[] chain, String authType) {} -+ -+ @Override -+ public void checkServerTrusted(X509Certificate[] chain, String authType) {} -+ -+ @Override -+ public X509Certificate[] getAcceptedIssuers() { -+ return new X509Certificate[0]; -+ } - } - - /** -diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties -index 4b61f30..1e22e8d 100644 ---- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties -+++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/native-image.properties -@@ -20,14 +20,8 @@ - - Args = --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder \ - --initialize-at-build-time=org.slf4j.LoggerFactory \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.channel.epoll \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.channel.unix \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.internal.logging.Slf4JLoggerFactory$NopInstanceHolder \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.util.internal.logging.Log4JLogger \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.internal.tcnative \ -- --initialize-at-run-time=io.grpc.netty.shaded.io.netty.handler.ssl \ - -H:DynamicProxyConfigurationResources=${.}/proxy-config.json \ - -H:JNIConfigurationResources=${.}/jni-config.json \ - -H:ReflectionConfigurationResources=${.}/reflect-config.json \ - -H:ResourceConfigurationResources=${.}/resource-config.json \ -- -H:SerializationConfigurationResources=${.}/serialization-config.json -\ No newline at end of file -+ -H:SerializationConfigurationResources=${.}/serialization-config.json -diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json -index 44fa4dc..1dcb4ec 100644 ---- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json -+++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/reflect-config.json -@@ -137,203 +137,6 @@ - { - "name":"io.grpc.internal.PickFirstLoadBalancerProvider" - }, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.AbstractNettyHandler", -- "methods":[ -- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler", -- "methods":[ -- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$GrpcNegotiationHandler", -- "methods":[{"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$ProtocolNegotiationHandler", -- "methods":[{"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.ProtocolNegotiators$WaitUntilActiveHandler", -- "methods":[{"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.grpc.netty.WriteBufferingAndExceptionHandler", -- "methods":[ -- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, -- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator", -- "allDeclaredMethods":true --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.buffer.AbstractReferenceCountedByteBuf", -- "fields":[{"name":"refCnt"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelDuplexHandler", -- "methods":[ -- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelInboundHandlerAdapter", -- "methods":[ -- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, -- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.ChannelInitializer", -- "methods":[ -- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext", -- "methods":[ -- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"close","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, -- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"write","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultChannelPipeline$TailContext", -- "methods":[ -- {"name":"channelActive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelInactive","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelRegistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelUnregistered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"exceptionCaught","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Throwable"] }, -- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.DefaultFileRegion" --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.Epoll", -- "methods":[{"name":"isAvailable","parameterTypes":[] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoopGroup", -- "methods":[{"name":"","parameterTypes":["int","java.util.concurrent.ThreadFactory"] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.NativeDatagramPacketArray$NativeDatagramPacket" --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel", -- "methods":[{"name":"","parameterTypes":[] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.unix.PeerCredentials" --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.channel.epoll.EpollSocketChannel" --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder", -- "methods":[ -- {"name":"channelRead","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] }, -- {"name":"userEventTriggered","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.lang.Object"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2ConnectionHandler", -- "methods":[ -- {"name":"bind","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"channelReadComplete","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"channelWritabilityChanged","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"connect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","java.net.SocketAddress","java.net.SocketAddress","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"deregister","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"disconnect","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext","io.grpc.netty.shaded.io.netty.channel.ChannelPromise"] }, -- {"name":"flush","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] }, -- {"name":"read","parameterTypes":["io.grpc.netty.shaded.io.netty.channel.ChannelHandlerContext"] } -- ] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.AbstractReferenceCounted", -- "fields":[{"name":"refCnt"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil", -- "allDeclaredMethods":true --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.NativeLibraryUtil", -- "methods":[{"name":"loadLibrary","parameterTypes":["java.lang.String","boolean"] }] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueColdProducerFields", -- "fields":[{"name":"producerLimit"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueConsumerFields", -- "fields":[{"name":"consumerIndex"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.BaseMpscLinkedArrayQueueProducerFields", -- "fields":[{"name":"producerIndex"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueConsumerIndexField", -- "fields":[{"name":"consumerIndex"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerIndexField", -- "fields":[{"name":"producerIndex"}] --}, --{ -- "name":"io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueueProducerLimitField", -- "fields":[{"name":"producerLimit"}] --}, - { - "name":"io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider", - "methods":[{"name":"","parameterTypes":[] }] -diff --git a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json -index a260699..1670286 100644 ---- a/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json -+++ b/temporal-serviceclient/src/main/resources/META-INF/native-image/io/temporal/temporal-serviceclient/resource-config.json -@@ -1,7 +1,6 @@ - { - "resources":{ - "includes":[ -- {"pattern":"\\QMETA-INF/native/libio_grpc_netty_shaded_netty_transport_native_epoll_x86_64.so\\E"}, - {"pattern":"\\QMETA-INF/services/io.grpc.LoadBalancerProvider\\E"}, - {"pattern":"\\QMETA-INF/services/io.grpc.NameResolverProvider\\E"}, - {"pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E"}, -diff --git a/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SimpleSslContextBuilderTest.java b/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SimpleSslContextBuilderTest.java -index 7db0299..40ef428 100644 ---- a/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SimpleSslContextBuilderTest.java -+++ b/temporal-serviceclient/src/test/java/io/temporal/serviceclient/SimpleSslContextBuilderTest.java -@@ -1,13 +1,12 @@ - package io.temporal.serviceclient; - - import com.google.common.base.Preconditions; --import java.io.IOException; - import java.io.InputStream; - import org.junit.Test; - - public class SimpleSslContextBuilderTest { - @Test -- public void ableToLoadPKCS12Key() throws IOException { -+ public void ableToLoadPKCS12Key() throws Exception { - try (InputStream in = - SimpleSslContextBuilderTest.class.getClassLoader().getResourceAsStream("pkcs12-key.pfx")) { - Preconditions.checkState(in != null); -@@ -18,13 +17,13 @@ public class SimpleSslContextBuilderTest { - - // to give easier API for configuration to users we allow null inputs - @Test -- public void nullInputIsAcceptedForPKCS12Key() throws IOException { -+ public void nullInputIsAcceptedForPKCS12Key() throws Exception { - SimpleSslContextBuilder builder = SimpleSslContextBuilder.forPKCS12(null); - builder.build(); - } - - @Test -- public void ableToLoadPKCS8Key() throws IOException { -+ public void ableToLoadPKCS8Key() throws Exception { - try (InputStream pkIn = - SimpleSslContextBuilderTest.class.getClassLoader().getResourceAsStream("pkcs8-pk.pem"); - InputStream crtIn = -@@ -41,13 +40,13 @@ public class SimpleSslContextBuilderTest { - - // to give easier API for configuration to users we allow null inputs - @Test -- public void nullInputIsAcceptedForPKCS8Key() throws IOException { -+ public void nullInputIsAcceptedForPKCS8Key() throws Exception { - SimpleSslContextBuilder builder = SimpleSslContextBuilder.forPKCS8(null, null); - builder.build(); - } - - @Test -- public void ableToCreateWithoutKeyOrCerts() throws IOException { -+ public void ableToCreateWithoutKeyOrCerts() throws Exception { - SimpleSslContextBuilder builder = SimpleSslContextBuilder.noKeyOrCertChain(); - builder.build(); - } --- -2.50.1 (Apple Git-155) - diff --git a/patches/0004-Change-groupId-to-com.pkware.temporal.patch b/patches/0004-Change-groupId-to-com.pkware.temporal.patch index be75a36..c461ea0 100644 --- a/patches/0004-Change-groupId-to-com.pkware.temporal.patch +++ b/patches/0004-Change-groupId-to-com.pkware.temporal.patch @@ -1,4 +1,4 @@ -From c51f26b2555233499a05a4649b53253bb7205b81 Mon Sep 17 00:00:00 2001 +From 9c8aee90bc90d62c37f31f0ce0435fb837682785 Mon Sep 17 00:00:00 2001 From: Marius Volkhart Date: Thu, 21 May 2026 14:53:54 -0400 Subject: [PATCH] Change groupId to com.pkware.temporal diff --git a/patches/0005-Add-Wire-protobuf-support.patch b/patches/0005-Add-Wire-protobuf-support.patch index 8388625..f574ecf 100644 --- a/patches/0005-Add-Wire-protobuf-support.patch +++ b/patches/0005-Add-Wire-protobuf-support.patch @@ -1,4 +1,4 @@ -From 7c6bd04158b6cda8a7850a7ee2c9b6f2c9a16ed8 Mon Sep 17 00:00:00 2001 +From 091ae33efd46c9d4082921136703efb2767709ff Mon Sep 17 00:00:00 2001 From: Marius Volkhart Date: Thu, 28 May 2026 11:52:21 -0400 Subject: [PATCH] Add Wire protobuf support