diff -r dd6f5cc27d52 -r abf958bcc201 stream.go --- a/stream.go Sun Jan 01 17:28:00 2012 -0700 +++ b/stream.go Sun Jan 01 19:00:21 2012 -0700 @@ -293,6 +293,55 @@ } } +// Stanzas from the remote go up through a stack of filters to the +// app. This function manages the filters. +func filter(srvIn2 <-chan Stanza, cliOut2 chan<- Stanza, + filterOut <-chan <-chan Stanza, filterIn chan<- <-chan Stanza) { + defer close(cliOut2) + var srvIn1, topFilterOut1, topFilterOut2 <-chan Stanza + var cliOut1, botFilterIn1, botFilterIn2 chan<- Stanza + ch := make(chan Stanza, 1) + topFilterOut2 = ch + botFilterIn2 = ch + topFilterOut1 = topFilterOut2 + srvIn1 = srvIn2 + var botItem Stanza + var topItem Stanza + var ok bool + for { + select { + case newFilterOut := <- filterOut: + filterIn <- topFilterOut2 + topFilterOut2 = newFilterOut + if topFilterOut1 != nil { + topFilterOut1 = topFilterOut2 + } + + case topItem, ok = <-topFilterOut1: + if !ok { + break + } + topFilterOut1 = nil + cliOut1 = cliOut2 + case cliOut1 <- topItem: + topFilterOut1 = topFilterOut2 + cliOut1 = nil + + case botItem, ok = <-srvIn1: + if !ok { + close(botFilterIn2) + srvIn1 = nil + continue + } + srvIn1 = nil + botFilterIn1 = botFilterIn2 + case botFilterIn1 <- botItem: + srvIn1 = srvIn2 + botFilterIn1 = nil + } + } +} + func handleStream(ss *stream) { }