(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?)