Move wait-for-members and spy-on to conversation.rkt
This commit is contained in:
parent
c79eaf055f
commit
67a00406d0
|
@ -9,8 +9,11 @@
|
|||
(require "standard-thread.rkt")
|
||||
|
||||
(provide make-room
|
||||
room?
|
||||
room-name
|
||||
join-room
|
||||
wait-for-members
|
||||
spy-on
|
||||
|
||||
;; Management and communication
|
||||
(struct-out arrived)
|
||||
|
@ -51,6 +54,28 @@
|
|||
#:invisible? [invisible? #f])
|
||||
(make-object membership% (room-ch room) name break-on-departure? invisible?))
|
||||
|
||||
(define (wait-for-members room members)
|
||||
(define handle (join-room room (gensym 'wait-for-members) #:invisible? #t))
|
||||
(let loop ((remaining-members members))
|
||||
(if (null? remaining-members)
|
||||
#t
|
||||
(match (send handle listen)
|
||||
((arrived who) (loop (remove who remaining-members)))
|
||||
((departed who _) (if (member who members)
|
||||
(error 'wait-for-members "Waited-for member exited")
|
||||
(loop remaining-members)))
|
||||
(_ (loop remaining-members)))))
|
||||
(send handle depart))
|
||||
|
||||
(define (spy-on room)
|
||||
(thread (lambda ()
|
||||
(define spy-name (gensym 'spy))
|
||||
(define handle (join-room room spy-name #:invisible? #t))
|
||||
(let loop ()
|
||||
(define message (send handle listen))
|
||||
(log-info (format "~s/~s: ~s" spy-name (room-name room) message))
|
||||
(loop)))))
|
||||
|
||||
(define membership%
|
||||
(class* object% ()
|
||||
(init room-init)
|
||||
|
|
|
@ -639,28 +639,6 @@
|
|||
SSH_MSG_DEBUG handle-msg-debug
|
||||
SSH_MSG_KEXINIT handle-msg-kexinit))
|
||||
|
||||
(define (spy-on room)
|
||||
(define handle (join-room room (gensym 'spy) #:invisible? #t))
|
||||
(define (loop)
|
||||
(write (list (room-name room) (send handle listen)))
|
||||
(newline)
|
||||
(flush-output)
|
||||
(loop))
|
||||
(thread loop))
|
||||
|
||||
(define (wait-for-members room members)
|
||||
(define handle (join-room room (gensym 'wait-for-members) #:invisible? #t))
|
||||
(let loop ((remaining-members members))
|
||||
(if (null? remaining-members)
|
||||
#t
|
||||
(match (send handle listen)
|
||||
((arrived who) (loop (remove who remaining-members)))
|
||||
((departed who _) (if (member who members)
|
||||
(error 'wait-for-members "Waited-for member exited")
|
||||
(loop remaining-members)))
|
||||
(_ (loop remaining-members)))))
|
||||
(send handle depart))
|
||||
|
||||
(define (ssh-session role in out)
|
||||
(define io-room (make-room (gensym 'ssh-session-io-room)))
|
||||
(spy-on io-room)
|
||||
|
|
Loading…
Reference in New Issue