goblins-echo/goblins-echo.scm

64 lines
2.0 KiB
Scheme

(use-modules (goblins)
(goblins actor-lib methods)
(goblins vat)
(goblins ocapn captp)
(goblins ocapn ids)
(goblins ocapn netlayer prelay-utils)
(goblins ocapn netlayer prelay)
(fibers conditions)
(ice-9 match))
(define can-quit?
(make-condition))
(define echo-vat
(spawn-vat #:name "echo-vat"))
(define (^listener bcom)
(lambda (text) (format #t "~a\n" text)))
;; Proposal for a registry object that bundles up a netlayer and mycapn into a single two-method capability
;; See https://community.spritely.institute/t/feedback-on-ocapn-netlayers-interface/407
(define (^mycapn-registry bcom netlayer netlayer-type)
(define mycapn (spawn-mycapn netlayer))
(methods
[(register obj)
($ mycapn 'register obj netlayer-type)]
[(enliven id)
($ mycapn 'enliven id)]))
(define (prelay-sref->mycapn-registry setup-sref)
(on (fetch-and-spawn-prelay-netlayer setup-sref)
(lambda (netlayer)
(spawn ^mycapn-registry netlayer 'prelay))
#:promise? #t))
;; end proposal
(define (listen setup-sref)
(with-vat echo-vat
(on (prelay-sref->mycapn-registry setup-sref)
(lambda (registry)
(define listener (spawn ^listener))
(define listener-id ($ registry 'register listener))
(format #t "Listener registered at ~s\n" (ocapn-id->string listener-id))))))
(define (say setup-sref listener-sref text)
(with-vat echo-vat
(on (prelay-sref->mycapn-registry setup-sref)
(lambda (registry)
(on (<- (<- registry 'enliven listener-sref) text)
(lambda (_)
(format #t "sent message ~s.\n" text)
(signal-condition! can-quit?)))))))
(match (command-line)
[(_cmd "listen" setup-id)
(listen (string->ocapn-id setup-id))]
[(_cmd "say" setup-id listener-id text)
(say (string->ocapn-id setup-id) (string->ocapn-id listener-id) text)]
[unknown-cmd
(format #t "Unknown command ~a\n" unknown-cmd)
(signal-condition! can-quit?)])
(wait can-quit?)