func NewConn(name string, in io.ReadCloser, out io.WriteCloser) net.Conn {c := &fakeConn{name: name,reader: newFeeder(in.Read),writer: newFeeder(out.Write),in: in,out: out,}go c.reader.run()go c.writer.run()return c}
func (f *connFeeder) run() {var b []bytefor {// wait for an input requestselect {case b = <-f.input:case <-f.done:return}// invoke the underlying methodn, err := f.source(b)// send the result back to the requesterselect {case f.result <- feedResult{n: n, err: err}:case <-f.done:return}}}
type feedResult struct {n interr error}
type connFeeder struct {source func([]byte) (int, error)input chan []byteresult chan feedResultmu sync.Mutexclosed booldone chan struct{}}
func NewHeaderStream(conn net.Conn) Stream {return &headerStream{conn: conn,in: bufio.NewReader(conn),}}
func NewConn(s Stream) Conn {conn := &conn{stream: s,pending: make(map[ID]chan *Response),done: make(chan struct{}),}return conn}
func (s *streamServer) ServeStream(ctx context.Context, conn jsonrpc2.Conn) error {client := protocol.ClientDispatcher(conn)session := cache.NewSession(ctx, s.cache)svr := s.serverForTestif svr == nil {options := settings.DefaultOptions(s.optionsOverrides)svr = server.New(session, client, options)if instance := debug.GetInstance(ctx); instance != nil {instance.AddService(svr, session)}}// Clients may or may not send a shutdown message. Make sure the server is// shut down.// TODO(rFindley): this shutdown should perhaps be on a disconnected context.defer func() {if err := svr.Shutdown(ctx); err != nil {event.Error(ctx, "error shutting down", err)}}()executable, err := os.Executable()if err != nil {log.Printf("error getting gopls path: %v", err)executable = ""}ctx = protocol.WithClient(ctx, client)conn.Go(ctx,protocol.Handlers(handshaker(session, executable, s.daemon,protocol.ServerHandler(svr,jsonrpc2.MethodNotFound))))if s.daemon {log.Printf("Session %s: connected", session.ID())defer log.Printf("Session %s: exited", session.ID())}<-conn.Done()return conn.Err()}


文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




