Skip to content

Commit b5dd950

Browse files
authored
Remove Compression implicit requirement (#30)
1 parent 1428dd0 commit b5dd950

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

core/src/main/scala/org/ivovk/connect_rpc_scala/ConnectRouteBuilder.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package org.ivovk.connect_rpc_scala
33
import cats.Endo
44
import cats.effect.{Async, Resource}
55
import cats.implicits.*
6-
import fs2.compression.Compression
76
import io.grpc.{ManagedChannelBuilder, ServerBuilder, ServerServiceDefinition}
87
import org.http4s.dsl.Http4sDsl
98
import org.http4s.{HttpApp, HttpRoutes, Method}
@@ -15,18 +14,18 @@ import scala.concurrent.duration.*
1514

1615
object ConnectRouteBuilder {
1716

18-
def forService[F[_] : Async: Compression](service: ServerServiceDefinition): ConnectRouteBuilder[F] =
17+
def forService[F[_] : Async](service: ServerServiceDefinition): ConnectRouteBuilder[F] =
1918
ConnectRouteBuilder(Seq(service))
2019

21-
def forServices[F[_] : Async: Compression](service: ServerServiceDefinition, other: ServerServiceDefinition*): ConnectRouteBuilder[F] =
20+
def forServices[F[_] : Async](service: ServerServiceDefinition, other: ServerServiceDefinition*): ConnectRouteBuilder[F] =
2221
ConnectRouteBuilder(service +: other)
2322

24-
def forServices[F[_] : Async: Compression](services: Seq[ServerServiceDefinition]): ConnectRouteBuilder[F] =
23+
def forServices[F[_] : Async](services: Seq[ServerServiceDefinition]): ConnectRouteBuilder[F] =
2524
ConnectRouteBuilder(services)
2625

2726
}
2827

29-
case class ConnectRouteBuilder[F[_] : Async: Compression] private(
28+
case class ConnectRouteBuilder[F[_] : Async] private(
3029
services: Seq[ServerServiceDefinition],
3130
jsonPrinterConfigurator: Endo[Printer] = identity,
3231
serverBuilderConfigurator: Endo[ServerBuilder[_]] = identity,
@@ -56,11 +55,12 @@ case class ConnectRouteBuilder[F[_] : Async: Compression] private(
5655
val httpDsl = Http4sDsl[F]
5756
import httpDsl.*
5857

58+
val compressor = Compressor[F]
5959
val jsonPrinter = jsonPrinterConfigurator(JsonFormat.printer)
6060

6161
val codecRegistry = MessageCodecRegistry[F](
62-
JsonMessageCodec[F](jsonPrinter),
63-
ProtoMessageCodec[F],
62+
JsonMessageCodec[F](compressor, jsonPrinter),
63+
ProtoMessageCodec[F](compressor)
6464
)
6565

6666
val methodRegistry = MethodRegistry(services)

core/src/main/scala/org/ivovk/connect_rpc_scala/http/MessageCodec.scala

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ trait MessageCodec[F[_]] {
3535

3636
}
3737

38-
class JsonMessageCodec[F[_] : Sync : Compression](printer: Printer) extends MessageCodec[F] {
38+
class JsonMessageCodec[F[_] : Sync](compressor: Compressor[F], printer: Printer) extends MessageCodec[F] {
3939

4040
private val logger: Logger = LoggerFactory.getLogger(getClass)
4141

@@ -47,7 +47,7 @@ class JsonMessageCodec[F[_] : Sync : Compression](printer: Printer) extends Mess
4747
case str: String =>
4848
Sync[F].delay(URLDecoder.decode(str, charset))
4949
case stream: Stream[F, Byte] =>
50-
decompressed(entity.encoding, stream)
50+
compressor.decompressed(entity.encoding, stream)
5151
.through(decodeWithCharset(charset))
5252
.compile.string
5353
}
@@ -82,7 +82,7 @@ class JsonMessageCodec[F[_] : Sync : Compression](printer: Printer) extends Mess
8282

8383
}
8484

85-
class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
85+
class ProtoMessageCodec[F[_] : Async](compressor: Compressor[F]) extends MessageCodec[F] {
8686

8787
private val logger: Logger = LoggerFactory.getLogger(getClass)
8888

@@ -96,7 +96,7 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
9696
Async[F].delay(base64dec.decode(str.getBytes(entity.charset.nioCharset)))
9797
.flatMap(arr => Async[F].delay(cmp.parseFrom(arr)))
9898
case stream: Stream[F, Byte] =>
99-
toInputStreamResource(decompressed(entity.encoding, stream))
99+
toInputStreamResource(compressor.decompressed(entity.encoding, stream))
100100
.use(is => Async[F].delay(cmp.parseFrom(is)))
101101
}
102102

@@ -129,11 +129,16 @@ class ProtoMessageCodec[F[_] : Async : Compression] extends MessageCodec[F] {
129129

130130
}
131131

132-
def decompressed[F[_] : Compression](encoding: Option[ContentCoding], body: Stream[F, Byte]): Stream[F, Byte] = {
133-
body.through(encoding match {
134-
case Some(ContentCoding.gzip) =>
135-
Compression[F].gunzip().andThen(_.flatMap(_.content))
136-
case _ =>
137-
identity
138-
})
139-
}
132+
class Compressor[F[_]: Sync] {
133+
134+
given Compression[F] = Compression.forSync[F]
135+
136+
def decompressed(encoding: Option[ContentCoding], body: Stream[F, Byte]): Stream[F, Byte] =
137+
body.through(encoding match {
138+
case Some(ContentCoding.gzip) =>
139+
Compression[F].gunzip().andThen(_.flatMap(_.content))
140+
case _ =>
141+
identity
142+
})
143+
144+
}

0 commit comments

Comments
 (0)