Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ lazy val root = project
example,
flyway,
flywayPureConfig,
grpcServer,
grpcServerPureConfig,
http4sClientBlaze,
http4sClientBlazePureConfig,
http4sClientMonixCatnap,
Expand Down Expand Up @@ -168,6 +170,27 @@ lazy val flywayPureConfig = project
libraryDependencies += Dependencies.pureConfig
)

lazy val grpcServer = project
.in(file("grpc-server"))
.settings(commonSettings)
.settings(
name := "sst-grpc-server",
libraryDependencies ++= Seq(
Dependencies.grpcNettyShaded,
Dependencies.grpcProtobuf,
Dependencies.grpcStub
)
)

lazy val grpcServerPureConfig = project
.in(file("grpc-server-pureconfig"))
.dependsOn(grpcServer)
.settings(commonSettings)
.settings(
name := "sst-grpc-server-pureconfig",
libraryDependencies += Dependencies.pureConfig
)

lazy val http4sClientBlaze = project
.in(file("http4s-client-blaze"))
.settings(commonSettings)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.avast.sst.grpc.server.pureconfig

import com.avast.sst.grpc.server.GrpcServerConfig
import pureconfig.ConfigReader
import pureconfig.generic.semiauto.deriveReader

trait ConfigReaders {

implicit val grpcServerGrpcServerConfigReader: ConfigReader[GrpcServerConfig] = deriveReader

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.avast.sst.grpc.server.pureconfig

import pureconfig.ConfigFieldMapping
import pureconfig.generic.ProductHint

/** Contains [[pureconfig.ConfigReader]] instances with default "kebab-case" naming convention. */
object implicits extends ConfigReaders {

/** Contains [[pureconfig.ConfigReader]] instances with "kebab-case" naming convention.
*
* This is alias for the default `implicits._` import.
*/
object KebabCase extends ConfigReaders

/** Contains [[pureconfig.ConfigReader]] instances with "camelCase" naming convention. */
object CamelCase extends ConfigReaders {
implicit def hint[T]: ProductHint[T] = ProductHint(ConfigFieldMapping(pureconfig.CamelCase, pureconfig.CamelCase))
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.avast.sst.grpc.server

import java.util.concurrent.TimeUnit

import scala.concurrent.duration.Duration

final case class GrpcServerConfig(port: Int,
handshakeTimeout: Duration,
maxInboundMessageSize: Int = 4 * 1024 * 1024,
maxInboundMetadataSize: Int = 8192,
serverShutdownTimeout: Duration = Duration(10, TimeUnit.SECONDS))
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.avast.sst.grpc.server

import java.util.concurrent.TimeUnit

import cats.effect.{Resource, Sync}
import io.grpc.{Server, ServerBuilder, ServerInterceptor, ServerServiceDefinition}

import scala.collection.immutable.Seq
import scala.concurrent.ExecutionContext
object GrpcServerModule {

/** Makes [[io.grpc.Server]] (Netty) initialized with the given config, services and interceptors.
*
* @param services service implementations to be added to the handler registry
* @param executionContext executor to be used for the server
* @param interceptors that are run for all the services
*/
@SuppressWarnings(Array("org.wartremover.warts.NonUnitStatements"))
def make[F[_]: Sync](config: GrpcServerConfig,
services: Seq[ServerServiceDefinition],
executionContext: ExecutionContext,
interceptors: Seq[ServerInterceptor] = List.empty): Resource[F, Server] =
Resource.make {
Sync[F].delay {
val builder = ServerBuilder
.forPort(config.port)
.handshakeTimeout(config.handshakeTimeout.toMillis, TimeUnit.MILLISECONDS)
.maxInboundMessageSize(config.maxInboundMessageSize)
.maxInboundMetadataSize(config.maxInboundMetadataSize)
.executor(executionContext.execute)

services.foreach(builder.addService)
interceptors.foreach(builder.intercept)

builder.build.start()
}
} { s =>
Sync[F].delay {
s.shutdown().awaitTermination(config.serverShutdownTimeout.toMillis, TimeUnit.MILLISECONDS)
()
}
}

}
4 changes: 4 additions & 0 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ object Dependencies {
val doobie = "org.tpolecat" %% "doobie-core" % Versions.doobie
val doobieHikari = "org.tpolecat" %% "doobie-hikari" % Versions.doobie
val flywayCore = "org.flywaydb" % "flyway-core" % "6.1.2"
val grpcNettyShaded = "io.grpc" % "grpc-netty-shaded" % Versions.grpc
val grpcProtobuf = "io.grpc" % "grpc-protobuf" % Versions.grpc
val grpcStub = "io.grpc" % "grpc-stub" % Versions.grpc
val http4sBlazeClient = "org.http4s" %% "http4s-blaze-client" % Versions.http4s
val http4sBlazeServer = "org.http4s" %% "http4s-blaze-server" % Versions.http4s
val http4sClient = "org.http4s" %% "http4s-client" % Versions.http4s
Expand Down Expand Up @@ -35,6 +38,7 @@ object Dependencies {

val datastaxJavaDriverCore = "4.3.1"
val doobie = "0.7.1"
val grpc = "1.25.0"
val http4s = "0.20.15"
val micrometerCore = "1.3.2"
val micrometerJmx = "1.3.2"
Expand Down