mirror of
https://github.com/luxfi/node.git
synced 2026-07-27 03:39:39 +00:00
46 lines
1016 B
Go
46 lines
1016 B
Go
//go:build grpc
|
|
|
|
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package rpcreader
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
|
|
readerpb "github.com/luxfi/node/proto/pb/io/reader"
|
|
)
|
|
|
|
var _ readerpb.ReaderServer = (*Server)(nil)
|
|
|
|
// Server is an io.Reader that is managed over RPC.
|
|
type Server struct {
|
|
readerpb.UnsafeReaderServer
|
|
reader io.Reader
|
|
}
|
|
|
|
// NewServer returns an io.Reader instance managed remotely
|
|
func NewServer(reader io.Reader) *Server {
|
|
return &Server{reader: reader}
|
|
}
|
|
|
|
func (s *Server) Read(_ context.Context, req *readerpb.ReadRequest) (*readerpb.ReadResponse, error) {
|
|
buf := make([]byte, int(req.Length))
|
|
n, err := s.reader.Read(buf)
|
|
resp := &readerpb.ReadResponse{
|
|
Read: buf[:n],
|
|
}
|
|
if err != nil {
|
|
resp.Error = &readerpb.Error{
|
|
Message: err.Error(),
|
|
}
|
|
|
|
// Sentinel errors must be special-cased through an error code
|
|
if err == io.EOF {
|
|
resp.Error.ErrorCode = readerpb.ErrorCode_ERROR_CODE_EOF
|
|
}
|
|
}
|
|
return resp, nil
|
|
}
|