NewClientService returns a ClientService based on the given Coordinator pointer. The pointer is loaded on each processed connection.
(options ClientServiceOptions)
| 75 | // NewClientService returns a ClientService based on the given Coordinator pointer. The pointer is |
| 76 | // loaded on each processed connection. |
| 77 | func NewClientService(options ClientServiceOptions) ( |
| 78 | *ClientService, error, |
| 79 | ) { |
| 80 | s := &ClientService{Logger: options.Logger, CoordPtr: options.CoordPtr} |
| 81 | mux := drpcmux.New() |
| 82 | drpcService := &DRPCService{ |
| 83 | CoordPtr: options.CoordPtr, |
| 84 | Logger: options.Logger, |
| 85 | DerpMapUpdateFrequency: options.DERPMapUpdateFrequency, |
| 86 | DerpMapFn: options.DERPMapFn, |
| 87 | NetworkTelemetryHandler: options.NetworkTelemetryHandler, |
| 88 | ResumeTokenProvider: options.ResumeTokenProvider, |
| 89 | WorkspaceUpdatesProvider: options.WorkspaceUpdatesProvider, |
| 90 | } |
| 91 | err := proto.DRPCRegisterTailnet(mux, drpcService) |
| 92 | if err != nil { |
| 93 | return nil, xerrors.Errorf("register DRPC service: %w", err) |
| 94 | } |
| 95 | server := drpcserver.NewWithOptions(mux, drpcserver.Options{ |
| 96 | Manager: drpcsdk.DefaultDRPCOptions(nil), |
| 97 | Log: func(err error) { |
| 98 | if xerrors.Is(err, io.EOF) || |
| 99 | xerrors.Is(err, context.Canceled) || |
| 100 | xerrors.Is(err, context.DeadlineExceeded) { |
| 101 | return |
| 102 | } |
| 103 | options.Logger.Debug(context.Background(), "drpc server error", slog.Error(err)) |
| 104 | }, |
| 105 | }) |
| 106 | s.drpc = server |
| 107 | return s, nil |
| 108 | } |
| 109 | |
| 110 | func (s *ClientService) ServeClient(ctx context.Context, version string, conn net.Conn, streamID StreamID) error { |
| 111 | major, _, err := apiversion.Parse(version) |