func (y *yamuxer) handleConn(g grim.GrimReaper, conn net.Conn) { defer g.Wait() conf := yamux.DefaultConfig() conf.LogOutput = y.logOutput session, _ := yamux.Server(conn, conf) streamCh := make(chan net.Conn) g.SpawnFunc(processStreams(g.New(), conn, streamCh, y.dispatcher)) g.SpawnFunc(acceptStreams(y.logger, session, streamCh)) }
func processStreams(g grim.GrimReaper, conn net.Conn, streamCh chan net.Conn, dispatcher Dispatcher) grim.TaskFunc { return func(ctx context.Context) { defer conn.Close() for { select { case <-ctx.Done(): return case stream, ok := <-streamCh: if !ok { return } dispatcher.Dispatch(g.New(), stream) } } } }