Skip to content

Commit

Permalink
Added better configurability and mutability to Server.
Browse files Browse the repository at this point in the history
  • Loading branch information
darkfrog26 committed Oct 11, 2016
1 parent 70f0c11 commit 5f18120
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 9 deletions.
47 changes: 39 additions & 8 deletions core/jvm/src/main/scala/org/hyperscala/Server.scala
Expand Up @@ -6,12 +6,34 @@ import io.undertow.server.{HttpHandler, HttpServerExchange}
import io.undertow.util.{Headers, Sessions, StatusCodes}
import io.undertow.websockets.WebSocketConnectionCallback
import io.undertow.{Handlers, Undertow, UndertowOptions}
import pl.metastack.metarx.Sub

import scala.concurrent.duration._
import scala.language.experimental.macros
import scala.language.implicitConversions

class Server(host: String, port: Int, sessionDomain: Option[String] = None, sessionMaxAge: FiniteDuration = 0.seconds) extends Logging with HttpHandler {
class Server extends Logging with HttpHandler {
object config {
val autoRestart: Sub[Boolean] = sub(true)
val host: Sub[String] = sub("0.0.0.0")
val port: Sub[Int] = sub(8080)

object session {
val domain: Sub[Option[String]] = sub(None)
val maxAge: Sub[FiniteDuration] = sub(0.seconds)
}

private def sub[T](value: T): Sub[T] = {
val s = Sub[T](value)
s.silentAttach { value =>
if (autoRestart.get) {
restart()
}
}
s
}
}

private var instance: Option[Undertow] = None
private var handlers = List.empty[Handler]
private val sessionManager = new io.undertow.server.session.InMemorySessionManager("ServerSessionManager")
Expand All @@ -20,8 +42,8 @@ class Server(host: String, port: Int, sessionDomain: Option[String] = None, sess
setNext(Server.this)
}
private val sessionCookieConfig = new SessionCookieConfig {
sessionDomain.foreach(setDomain)
setMaxAge(sessionMaxAge.toSeconds.toInt)
config.session.domain.get.foreach(setDomain)
setMaxAge(config.session.maxAge.get.toSeconds.toInt)
}
val resourceManager = new FunctionalResourceManager(this)
private val resourceHandler = new FunctionalResourceHandler(resourceManager)
Expand All @@ -32,14 +54,16 @@ class Server(host: String, port: Int, sessionDomain: Option[String] = None, sess
def start(): Unit = synchronized {
val server = Undertow.builder()
.setServerOption(UndertowOptions.ENABLE_HTTP2, java.lang.Boolean.TRUE)
.addHttpListener(port, host)
.addHttpListener(config.port.get, config.host.get)
.setHandler(sessionAttachmentHandler)
.build()
server.start()
instance = Some(server)
logger.info(s"Server started on $host:$port...")
logger.info(s"Server started on ${config.host.get}:${config.port.get}...")
}

def isStarted: Boolean = instance.nonEmpty

def stop(): Unit = synchronized {
instance match {
case Some(server) => {
Expand All @@ -51,6 +75,11 @@ class Server(host: String, port: Int, sessionDomain: Option[String] = None, sess
}
}

def restart(): Unit = synchronized {
stop()
start()
}

def register(handler: Handler): Handler = synchronized {
handlers = (handler :: handlers).sorted
handler
Expand Down Expand Up @@ -142,17 +171,19 @@ object Server extends Logging {
}

def main(args: Array[String]): Unit = {
val server = new Server("localhost", 8080)
val server = new Server
server.config.host := "localhost"
server.config.port := 8080
server.register("/", "text/html", (hse: HttpServerExchange) => {
"<html><head><title>Root</title></head><body>This is the root</body></html>"
})
server.register("/test/**/wildcard.txt", "text/plain", (hse: HttpServerExchange) => "Wildcard!")
server.start()
}

def apply(app: WebApplication, host: String, port: Int, sessionDomain: Option[String] = None): Server = {
def apply(app: WebApplication): Server = {
// Instantiate Server
val server = new Server(host, port, sessionDomain) {
val server = new Server {
override def error(t: Throwable): Unit = app.error(t)
}

Expand Down
4 changes: 3 additions & 1 deletion example/jvm/src/main/scala/example/ExampleServer.scala
Expand Up @@ -5,7 +5,9 @@ import java.io.File
import org.hyperscala._

object ExampleServer {
val server = Server(ExampleApplication, "0.0.0.0", 8080)
val server = Server(ExampleApplication)
server.config.host := "0.0.0.0"
server.config.port := 8080

def session: ExampleSession = ExampleSession()

Expand Down

0 comments on commit 5f18120

Please sign in to comment.