diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-21 21:40:41 +0100 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-21 21:40:41 +0100 |
| commit | b2b01b74910f455d2d010ba659e6e7514ea79489 (patch) | |
| tree | e2c6e33e7d9d6b00106daa2e3b5ddc5d842a2c9e /example/haberdasherserver.nim | |
| parent | cd061d43cbc7201649bdfd166870a44d37a0588f (diff) | |
| download | nimtwirp-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.nim | 30 |
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() |
