MCPcopy Index your code
hub / github.com/microsoft/typescript-go / dispatchLoop

Method dispatchLoop

internal/lsp/server.go:532–591  ·  view source on GitHub ↗
(ctx context.Context)

Source from the content-addressed store, hash-verified

530}
531
532func (s *Server) dispatchLoop(ctx context.Context) error {
533 ctx, lspExit := context.WithCancelCause(ctx)
534 defer lspExit(nil)
535 for {
536 req, err := s.requestQueue.Get(ctx)
537 if err != nil {
538 return err
539 }
540
541 s.lastRequestTimeMs.Store(time.Now().UnixMilli())
542 requestCtx := locale.WithLocale(ctx, s.locale)
543 var cancel context.CancelFunc
544 if req.ID != nil {
545 requestCtx, cancel = context.WithCancel(core.WithRequestID(requestCtx, req.ID.String()))
546 s.pendingClientRequestsMu.Lock()
547 s.pendingClientRequests[*req.ID] = pendingClientRequest{
548 req: req,
549 cancel: cancel,
550 }
551 s.pendingClientRequestsMu.Unlock()
552 }
553
554 handleError := func(err error) {
555 if errors.Is(err, context.Canceled) {
556 if err := s.sendError(req.ID, lsproto.ErrorCodeRequestCancelled); err != nil {
557 lspExit(err)
558 }
559 } else if errors.Is(err, io.EOF) {
560 lspExit(nil)
561 } else {
562 if err := s.sendError(req.ID, err); err != nil {
563 lspExit(err)
564 }
565 }
566 }
567
568 removeRequest := func() {
569 if req.ID != nil {
570 defer cancel()
571 s.pendingClientRequestsMu.Lock()
572 defer s.pendingClientRequestsMu.Unlock()
573 delete(s.pendingClientRequests, *req.ID)
574 }
575 }
576
577 if doAsyncWork, err := s.handleRequestOrNotification(requestCtx, req); err != nil {
578 handleError(err)
579 removeRequest()
580 } else if doAsyncWork != nil {
581 go func() {
582 if lsError := doAsyncWork(); lsError != nil {
583 handleError(lsError)
584 }
585 removeRequest()
586 }()
587 } else {
588 removeRequest()
589 }

Callers 1

RunMethod · 0.95

Calls 11

sendErrorMethod · 0.95
WithLocaleFunction · 0.92
WithRequestIDFunction · 0.92
handleErrorFunction · 0.85
StoreMethod · 0.80
GetMethod · 0.65
NowMethod · 0.65
StringMethod · 0.65
LockMethod · 0.45
UnlockMethod · 0.45

Tested by

no test coverage detected