All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kyo.examples.ledger.api.Server.scala Maven / Gradle / Ivy

package kyo.examples.ledger.api

import java.util.concurrent.Executors
import kyo.*
import kyo.examples.ledger.db.DB
import sttp.tapir.server.netty.*

object Server extends KyoApp:

    def flag(name: String, default: String) =
        Option(System.getenv(name))
            .getOrElse(System.getProperty(name, default))

    run {

        val port = flag("PORT", "9999").toInt

        val dbConfig =
            DB.Config(
                flag("DB_PATH", "/tmp/"),
                flag("flushInternalMs", "1000").toInt.millis
            )

        val options =
            NettyKyoServerOptions
                .default(enableLogging = false)
                .forkExecution(false)

        val cfg =
            NettyConfig.default
                .withSocketKeepAlive
                .copy(lingerTimeout = None)

        val server =
            NettyKyoServer(options, cfg)
                .host("0.0.0.0")
                .port(port)

        val timer = Timer(Executors.newSingleThreadScheduledExecutor())

        val init = defer {
            val db      = await(Envs.run(dbConfig)(DB.init))
            val handler = await(Envs.run(db)(Handler.init))
            await(Envs.run(handler)(Endpoints.init))
        }

        defer {
            await(Consoles.println(s"Server starting on port $port..."))
            val binding = await(Routes.run(server)(Timers.let(timer)(init)))
            await(Consoles.println(s"Server started: ${binding.localSocket}"))
        }
    }

end Server




© 2015 - 2025 Weber Informatics LLC | Privacy Policy