Albert Latacz
10/05/2021, 2:04 PMimport org.http4k.core.ContentType.Companion.TEXT_HTML
import org.http4k.core.Method
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.core.then
import org.http4k.core.with
import org.http4k.filter.CorsPolicy.Companion.UnsafeGlobalPermissive
import org.http4k.filter.ServerFilters
import org.http4k.lens.Header.CONTENT_TYPE
import org.http4k.lens.Path
import org.http4k.routing.bind
import org.http4k.routing.path
import org.http4k.routing.routes
import org.http4k.routing.sse
import org.http4k.server.PolyHandler
import org.http4k.server.Undertow
import org.http4k.server.asServer
import org.http4k.sse.Sse
import org.http4k.sse.SseFilter
import org.http4k.sse.SseMessage
import org.http4k.sse.then
fun main() {
val namePath = Path.of("name")
val sayHello = SseFilter { next ->
{
println("Hello from the sse!")
next(it)
}
}
val sse = sayHello.then(
sse(
"/{name}" bind { sse: Sse ->
val name = namePath(sse.connectRequest)
sse.send(SseMessage.Data("hello $name"))
sse.onClose { println("$name is closing") }
}
)
)
val routes = routes("/hello/{name}" bind Method.GET to {
Response(OK).body(
"""
<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
<div id="result"></div>
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("<http://localhost:8080/${it.path(>"name")}");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br>";
};
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>
</body>
</html>
""".trimIndent()
).with(CONTENT_TYPE of TEXT_HTML)
}
)
val http = ServerFilters.Cors(UnsafeGlobalPermissive).then(routes)
PolyHandler(http, sse = sse).asServer(Undertow(8080)).start()
}
and hit http://localhost:8080/hello/serverSentEvent