32 lines
1.0 KiB
Racket
32 lines
1.0 KiB
Racket
#lang imperative-syndicate
|
|
|
|
(provide server-facet/tcp
|
|
default-tcp-server-port
|
|
spawn-tcp-server!)
|
|
|
|
(require "../wire-protocol.rkt")
|
|
(require "../internal-protocol.rkt")
|
|
|
|
(require/activate imperative-syndicate/drivers/tcp)
|
|
(require/activate imperative-syndicate/distributed/server)
|
|
|
|
(define (server-facet/tcp id)
|
|
(assert (tcp-accepted id))
|
|
(assert (server-poa id))
|
|
(on-start (issue-unbounded-credit! tcp-in id))
|
|
(define accumulate! (packet-accumulator (lambda (p) (send! (message-poa->server id p)))))
|
|
(on (message (tcp-in id $bs))
|
|
(accumulate! bs))
|
|
(on (message (message-server->poa id $p))
|
|
(send! (tcp-out id (encode p)))
|
|
(when (Err? p) (stop-current-facet))))
|
|
|
|
(define default-tcp-server-port 8001)
|
|
|
|
(define (spawn-tcp-server! [port default-tcp-server-port])
|
|
(spawn #:name 'tcp-server-listener
|
|
(during/spawn (tcp-connection $id (tcp-listener port))
|
|
#:name `(server-poa ,id)
|
|
(on-start (issue-credit! (tcp-listener port)))
|
|
(server-facet/tcp id))))
|