Skip to content

Commit fa8c79a

Browse files
authored
Merge pull request #437 from armanbilge/topic/optimize-handleRequest
Optimize `IOLambda#handleRequest` on JVM
2 parents 13d45c6 + 8ca2706 commit fa8c79a

File tree

3 files changed

+19
-32
lines changed

3 files changed

+19
-32
lines changed

build.sbt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ lazy val lambda = crossProject(JSPlatform, JVMPlatform)
122122
.jvmSettings(
123123
libraryDependencies ++= Seq(
124124
"com.amazonaws" % "aws-lambda-java-core" % "1.2.3",
125-
"co.fs2" %%% "fs2-io" % fs2Version,
126-
"io.circe" %%% "circe-fs2" % "0.14.1"
125+
"co.fs2" %%% "fs2-io" % fs2Version
127126
)
128127
)
129128
.dependsOn(core)

lambda/jvm/src/main/scala/feral/lambda/IOLambdaPlatform.scala

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,41 @@
1616

1717
package feral.lambda
1818

19-
import cats.data.OptionT
2019
import cats.effect.IO
21-
import cats.effect.kernel.Resource
2220
import com.amazonaws.services.lambda.{runtime => lambdaRuntime}
23-
import io.circe
2421
import io.circe.Printer
22+
import io.circe.jawn
2523
import io.circe.syntax._
2624

2725
import java.io.InputStream
2826
import java.io.OutputStream
2927
import java.io.OutputStreamWriter
28+
import java.nio.channels.Channels
3029
import scala.concurrent.Await
31-
import scala.concurrent.duration.Duration
30+
import scala.concurrent.duration._
3231

3332
private[lambda] abstract class IOLambdaPlatform[Event, Result]
3433
extends lambdaRuntime.RequestStreamHandler { this: IOLambda[Event, Result] =>
3534

3635
final def handleRequest(
3736
input: InputStream,
3837
output: OutputStream,
39-
context: lambdaRuntime.Context): Unit = {
38+
runtimeContext: lambdaRuntime.Context): Unit = {
4039
val (dispatcher, lambda) =
41-
Await.result(setupMemo, Duration.Inf)
40+
Await.result(setupMemo, runtimeContext.getRemainingTimeInMillis().millis)
4241

43-
dispatcher.unsafeRunSync {
44-
Resource
45-
.eval {
46-
for {
47-
event <- fs2
48-
.io
49-
.readInputStream(IO.pure(input), 8192, closeAfterUse = false)
50-
.through(circe.fs2.byteStreamParser)
51-
.through(circe.fs2.decoder[IO, Event])
52-
.head
53-
.compile
54-
.lastOrError
55-
context <- IO(Context.fromJava[IO](context))
56-
_ <- OptionT(lambda(event, context)).foreachF { result =>
57-
Resource.fromAutoCloseable(IO(new OutputStreamWriter(output))).use { writer =>
58-
IO.blocking(Printer.noSpaces.unsafePrintToAppendable(result.asJson, writer))
59-
}
60-
}
61-
} yield ()
62-
}
63-
.onFinalize(IO.blocking(input.close()) &> IO.blocking(output.close()))
64-
.use_
65-
}
42+
val event = jawn.decodeChannel[Event](Channels.newChannel(input)).fold(throw _, identity(_))
43+
val context = Context.fromJava[IO](runtimeContext)
44+
dispatcher
45+
.unsafeRunTimed(
46+
lambda(event, context),
47+
runtimeContext.getRemainingTimeInMillis().millis
48+
)
49+
.foreach { result =>
50+
val writer = new OutputStreamWriter(output)
51+
Printer.noSpaces.unsafePrintToAppendable(result.asJson, writer)
52+
writer.flush()
53+
}
6654
}
6755

6856
}

lambda/jvm/src/test/scala/feral/lambda/IOLambdaJvmSuite.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class IOLambdaJvmSuite extends FunSuite {
6262
override def getInvokedFunctionArn(): String = ""
6363
override def getIdentity(): runtime.CognitoIdentity = null
6464
override def getClientContext(): runtime.ClientContext = null
65-
override def getRemainingTimeInMillis(): Int = 0
65+
override def getRemainingTimeInMillis(): Int = Int.MaxValue
6666
override def getMemoryLimitInMB(): Int = 0
6767
override def getLogger(): runtime.LambdaLogger = null
6868
}

0 commit comments

Comments
 (0)