#lang syndicate (require/activate syndicate/reload) (require/activate syndicate/supervise) (require/activate "trust.rkt") (require/activate "qa.rkt") (require "protocol.rkt") (require "duplicate.rkt") ;; TODO: Move to protocol.rkt (struct online () #:prefab) (struct present (email) #:prefab) (supervise (spawn #:name 'reflect-presence (stop-when-reloaded) (during (api (session $who _) (online)) (during (permitted who $grantee (p:follow who) _) ;; `who` allows `grantee` to follow them (assert (api (session grantee _) (present who))))))) (supervise (spawn #:name 'ensure-p:follow-symmetric (stop-when-reloaded) (on (asserted (permitted $A $B (p:follow $maybe-A) _)) (when (equal? A maybe-A) (send! (create-resource (permission-request B A (p:follow B)))))) (on (retracted (permitted $A $B (p:follow $maybe-A) _)) (when (equal? A maybe-A) (send! (delete-resource (permission-request B A (p:follow B)))) (send! (delete-resource (permitted B A (p:follow B) ?))))) (on (retracted (permission-request $A $B (p:follow $maybe-A))) (when (equal? A maybe-A) (when (not (immediate-query [query-value #f (permitted A B (p:follow A) _) #t])) (send! (delete-resource (permitted B A (p:follow B) ?)))))))) (supervise (spawn #:name 'contact-list-factory (stop-when-reloaded) (during (permission-request $A $B (p:follow $maybe-A)) (when (equal? A maybe-A) (assert (contact-list-entry B A)))) (during (permitted $A $B (p:follow $maybe-A) _) (when (equal? A maybe-A) (when (string