aboutsummaryrefslogtreecommitdiff
path: root/example/haberdasherserver.nim
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-21 21:40:41 +0100
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-21 21:40:41 +0100
commitb2b01b74910f455d2d010ba659e6e7514ea79489 (patch)
treee2c6e33e7d9d6b00106daa2e3b5ddc5d842a2c9e /example/haberdasherserver.nim
parentcd061d43cbc7201649bdfd166870a44d37a0588f (diff)
downloadnimtwirp-b2b01b74910f455d2d010ba659e6e7514ea79489.tar.gz
nimtwirp-b2b01b74910f455d2d010ba659e6e7514ea79489.zip
Try to make server side as async as you can get
Diffstat (limited to 'example/haberdasherserver.nim')
-rw-r--r--example/haberdasherserver.nim30
1 files changed, 23 insertions, 7 deletions
diff --git a/example/haberdasherserver.nim b/example/haberdasherserver.nim
index ba85e83..cdb25cb 100644
--- a/example/haberdasherserver.nim
+++ b/example/haberdasherserver.nim
@@ -2,13 +2,13 @@ import asynchttpserver
import asyncdispatch
import random
+import nimtwirp/nimtwirp
import nimtwirp/errors
-import nimtwirp/response
import service_pb
import service_twirp
-proc MakeHatImpl(service: Haberdasher, size: twirp_example_haberdasher_Size): twirp_example_haberdasher_Hat =
+proc MakeHatImpl(service: Haberdasher, size: twirp_example_haberdasher_Size): Future[twirp_example_haberdasher_Hat] {.async.} =
if size.inches <= 0:
raise newTwirpError(TwirpInvalidArgument, "I can't make a hat that small!")
@@ -17,6 +17,8 @@ proc MakeHatImpl(service: Haberdasher, size: twirp_example_haberdasher_Size): tw
result.color = rand(["white", "black", "brown", "red", "blue"])
result.name = rand(["bowler", "baseball cap", "top hat", "derby"])
+# You can do serving this way if you want to customize the process a bit
+
var
server = newAsyncHttpServer()
service {.threadvar.}: Haberdasher
@@ -24,8 +26,22 @@ var
service = newHaberdasher()
service.MakeHatImpl = MakeHatImpl
-proc cb(req: Request) {.async.} =
- var resp = HaberdasherHandler(service, req)
- await respond(req, resp)
-
-waitFor server.serve(Port(8080), cb)
+proc handler(req: Request) {.async.} =
+ # Each service will have a generated handleRequest() proc which takes the
+ # service object and a asynchttpserver.Request object and returns a
+ # Future[nimtwirp.Response].
+ var fut = handleRequest(service, req)
+ yield fut
+ if fut.failed:
+ await respond(req, nimtwirp.newResponse(fut.readError()))
+ else:
+ await respond(req, fut.read())
+
+waitFor server.serve(Port(8080), handler)
+
+# Or this way (idea copied from Jester) if your needs are simple.
+#
+#var settings = newSettings(8080)
+#twirpServices(settings):
+# service
+#runForever()