#lang racket (require goblins goblins/actor-lib/bootstrap goblins/actor-lib/ward syrup "rich-interface-tools.rkt" "cad.rkt") ;; Description warden/incanter pair ;; ================================ (define-vat-run describe-vat-run (make-vat)) (define-values (describe-warden describe) (describe-vat-run (spawn-warding-pair #:async? #t))) ;; Repeater behavior and contracts ;; =============================== (define parrot-string/c (-> string? positive-integer? string?)) (define parrot-string/iface '(-> string? positive-integer? string?)) (define parrot-string-cad (cadify 'parrot-string parrot-string/iface)) (define/contract (parrot-string str numtimes) parrot-string/c (string-append "BAWK! " (for/fold ([result-str "BAWK!!!"]) ([i numtimes]) (string-append str "! " result-str)))) (define (^parrot _bcom) (ward describe-warden (lambda _ parrot-string/iface) #:extends parrot-string #:async? #t)) (module+ main (require goblins/ocapn goblins/ocapn/netlayer/onion) (define-vat-run a-run (make-vat)) (define-vat-run machine-run (make-vat)) (define mycapn (machine-run (spawn-mycapn (setup-onion-netlayer)))) (define parrot (a-run (spawn ^parrot))) (define parrot-sref (machine-run ($ mycapn 'register parrot 'onion))) (define describe-sref (machine-run ($ mycapn 'register describe 'onion))) (displayln "*** Connect to parrot at:") (displayln (ocapn-sturdyref->string parrot-sref)) (displayln "*** Connect to describe incanter at:") (displayln (ocapn-sturdyref->string describe-sref)) (displayln "*** Or, simply run:") (displayln (format "racket rich-interface-client.rkt ~a ~a" (ocapn-sturdyref->string parrot-sref) (ocapn-sturdyref->string describe-sref))) ;; keep things alive hack (sync (make-semaphore))) (module+ test (define-vat-run a-run (make-vat)) (define parrot (a-run (spawn ^parrot))) (a-run (on (<- describe parrot) explain-iface)) )