34 lines
1.3 KiB
Racket
34 lines
1.3 KiB
Racket
#lang syndicate
|
|
;; Sketch of a DNS intra-program protocol
|
|
|
|
(assertion-struct dns-entry (name address))
|
|
|
|
(require/activate syndicate/drivers/timestate)
|
|
|
|
(spawn #:name 'server
|
|
(during (observe (dns-entry "localhost" _))
|
|
(on-start (printf "asserting localhost record\n"))
|
|
(on-stop (printf "retracting localhost record\n"))
|
|
(assert (dns-entry "localhost" "127.0.0.1"))))
|
|
|
|
(spawn #:name 'cache
|
|
(on (asserted (observe (dns-entry $name _)))
|
|
(define deadline (+ (current-inexact-milliseconds) 2000))
|
|
(react (stop-when (asserted (later-than deadline)))
|
|
(on-start (printf "caching ~a\n" name))
|
|
(on-stop (printf "uncaching ~a\n" name))
|
|
(assert (observe (dns-entry name _))))))
|
|
|
|
(spawn #:name 'main
|
|
(stop-when (asserted (dns-entry "localhost" $addr))
|
|
(printf "localhost is ~a\n" addr)
|
|
(sleep 1)
|
|
(react (stop-when (asserted (dns-entry "localhost" $addr))
|
|
(printf "localhost is still ~a\n" addr)
|
|
(sleep 2)
|
|
(react (stop-when (asserted (dns-entry "localhost" $addr))
|
|
(printf "localhost is STILL ~a\n" addr)))))))
|
|
|
|
(module+ main
|
|
(file-stream-buffer-mode (current-output-port) 'line))
|