-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserver.rkt
64 lines (50 loc) · 1.46 KB
/
server.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#lang racket/base
(require
"server-call.rkt"
"timestamp.rkt"
"status.rkt"
"ffi/server.rkt"
(submod "ffi/server.rkt" unsafe)
"ffi/completion-queue.rkt"
"ffi/byte-buffer.rkt"
racket/port
racket/async-channel
racket/match
ffi/unsafe
racket/list
(rename-in
racket/contract
[-> c:->]))
(provide
(contract-out
[server-config
(c:-> (hash/c (and/c string? immutable?) (c:-> any/c any) #:immutable #t)
(listof (and/c string? immutable?))
server-config?)]
[start-server (c:-> server-config? none/c)]))
(struct server-config
(methods addresses))
(define (start-server config)
(define cq (make-grpc-completion-queue))
(define server
(make-grpc-server
cq
(map grpc-server-insecure-http2-port (server-config-addresses config))))
(define methods (server-config-methods config))
(let loop ()
(define server-call (request-server-call server cq))
(thread
(lambda ()
(define message (sync (server-call-recv-message-evt server-call)))
(define output
(match (hash-ref methods (server-call-method server-call) 'unimplemented)
['unimplemented
;; TODO(endobson) send back unimplemented status code]
#""]
[fun
(fun message)]))
(sync (server-call-send server-call
#:message #"response"
#:status ok-status))
(server-call-wait server-call)))
(loop)))