syndicate-2017/racket/syndicate-monolithic/examples/tcp-hello.rkt

37 lines
1.4 KiB
Racket

#lang syndicate-monolithic
(require "../drivers/tcp.rkt")
(require "../demand-matcher.rkt")
(spawn-tcp-driver)
(define server-id (tcp-listener 5999))
(define (spawn-connection-handler c)
(log-info "spawn-connection-handler ~v" c)
(define (connection-handler e n)
(when e (log-info "connection-handler ~v: ~v /// ~v" c e n))
(match e
[(scn (? trie-empty?)) (quit)]
[(message (tcp-channel src dst #"quit\n"))
(quit (message (tcp-channel dst src #"OK, then.\n")))]
[(message (tcp-channel src dst bs))
(transition n (message (tcp-channel dst src (string->bytes/utf-8
(format "You said: ~a" bs)))))]
[_
(and (< n 5)
(transition (+ n 1) (message (tcp-channel server-id c (string->bytes/utf-8
(format "msg ~v\n" n))))))]))
(spawn connection-handler
0
(scn/union (subscription (advertise (tcp-channel c server-id ?)))
(subscription (tcp-channel c server-id ?))
(advertisement (tcp-channel server-id c ?)))))
(spawn-demand-matcher (advertise (tcp-channel (?!) server-id ?))
(observe (tcp-channel (?!) server-id ?))
spawn-connection-handler
(lambda (c)
(log-info "Connection handler ~v decided to exit" c)
'()))