137 lines
3.1 KiB
Plaintext
137 lines
3.1 KiB
Plaintext
type Content {
|
|
body: Bytes
|
|
kind: Text
|
|
}
|
|
|
|
listening(result: dever.net.ListenResult.Listening(listener)) (
|
|
value: dever.system.Listener
|
|
) {
|
|
value = listener
|
|
}
|
|
|
|
listening(result: dever.net.ListenResult.Failed(message)) (value: dever.system.Listener) {
|
|
fail(app.WorkerFailure.Failed(message))
|
|
}
|
|
|
|
bound(result: dever.net.PortResult.Bound(port)) (value: Int) {
|
|
value = port
|
|
}
|
|
|
|
bound(result: dever.net.PortResult.Failed(message)) (value: Int) {
|
|
fail(app.WorkerFailure.Failed(message))
|
|
}
|
|
|
|
paused(result: dever.time.SleepResult.Done) () {}
|
|
|
|
paused(result: dever.time.SleepResult.Failed(message)) () {
|
|
fail(app.WorkerFailure.Failed(message))
|
|
}
|
|
|
|
closed(result: dever.io.CloseResult.Closed) () {}
|
|
|
|
closed(result: dever.io.CloseResult.Failed(message)) () {
|
|
fail(app.WorkerFailure.Failed(message))
|
|
}
|
|
|
|
server_tls(result: dever.tls.ServerResult.Ready(tls)) (value: dever.system.ServerTls) {
|
|
value = tls
|
|
}
|
|
|
|
server_tls(result: dever.tls.ServerResult.Failed(message)) (
|
|
value: dever.system.ServerTls
|
|
) {
|
|
fail(app.WorkerFailure.Failed(message))
|
|
}
|
|
|
|
response_value(content: Content) (result: dever.http.Response) {
|
|
result = dever.http.Response {
|
|
status = 200
|
|
headers = [dever.http.header("Content-Type", content.kind)]
|
|
body = content.body
|
|
}
|
|
}
|
|
|
|
route(request: dever.http.Request, large: Bytes) (response: dever.http.Response) {
|
|
response = response_value(select(request.target, large))
|
|
}
|
|
|
|
select(path: "/plain", large: Bytes) (result: Content) {
|
|
result = Content {
|
|
body = dever.bytes.from_text("hello")
|
|
kind = "text/plain"
|
|
}
|
|
}
|
|
|
|
select(path: "/json", large: Bytes) (result: Content) {
|
|
result = Content {
|
|
body = dever.bytes.from_text("{\"ok\":true}")
|
|
kind = "application/json"
|
|
}
|
|
}
|
|
|
|
select(path: "/bytes", large: Bytes) (result: Content) {
|
|
result = Content {
|
|
body = large
|
|
kind = "application/octet-stream"
|
|
}
|
|
}
|
|
|
|
select(path: other, large: Bytes) (result: Content) {
|
|
result = Content {
|
|
body = dever.bytes.from_text("unknown benchmark path")
|
|
kind = "text/plain"
|
|
}
|
|
}
|
|
|
|
serve(
|
|
listener: dever.system.Listener,
|
|
tls: null,
|
|
limits: dever.http.Limits,
|
|
large: Bytes
|
|
) () {
|
|
dever.system.http_serve(route, listener, limits, large)
|
|
}
|
|
|
|
serve(
|
|
listener: dever.system.Listener,
|
|
tls: dever.system.ServerTls,
|
|
limits: dever.http.Limits,
|
|
large: Bytes
|
|
) () {
|
|
dever.system.http_serve_tls(route, listener, limits, tls, large)
|
|
}
|
|
|
|
worker(
|
|
tls: dever.system.ServerTls?,
|
|
limits: dever.http.Limits,
|
|
large: Bytes,
|
|
lifetime: Int
|
|
) () {
|
|
listener = listening(result(dever.net.listen("127.0.0.1", 0)))
|
|
port = bound(result(dever.net.port(listener)))
|
|
server = run(serve(listener, tls, limits, large))
|
|
blocking(dever.io.println("READY|" + int.to_text(port)))
|
|
paused(result(dever.task.sleep(lifetime)))
|
|
closed(result(dever.net.close_listener(listener)))
|
|
stop(server)
|
|
}
|
|
|
|
port.plain(limits: dever.http.Limits, large: Bytes, lifetime: Int) () {
|
|
worker(null, limits, large, lifetime)
|
|
}
|
|
|
|
port.secure(
|
|
limits: dever.http.Limits,
|
|
large: Bytes,
|
|
lifetime: Int,
|
|
certificate: Bytes,
|
|
key: Bytes
|
|
) () {
|
|
worker(
|
|
server_tls(result(dever.tls.server(certificate, key))),
|
|
limits,
|
|
large,
|
|
lifetime
|
|
)
|
|
}
|