900f67e3d0
* Implement psclient interface * Add string method to pieceID type * try to fix linter errors * Whoops missed an error * More linter errors * Typo * Lol double typo * Get everything working, begin adding tests for psclient rpc * goimports * Forgot to change the piecestore cli when changed the piecestore code * Fix CLI * remove ID length, added validator to pieceID * Move grpc ranger to client Change client PUT api to take a reader rather than return a writer * GRPCRanger -> PieceRanger; Make PieceRanger a RangeCloser * Forgot to remove offset * Added message upon successful store * Do that thing dennis and kaloyan wanted * goimports * Make closeConn a part of the interface for psclient * Use interface * Removed uneccessary new lines * goimport * Whoops * Actually we don't want to use the interface in Piece Ranger * Renamed piecestore in examples to piecestore-client; moved piecestore-cli to examples * Make comments look nicer
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
// Copyright (C) 2018 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"storj.io/storj/pkg/utils"
|
|
pb "storj.io/storj/protos/piecestore"
|
|
)
|
|
|
|
// StreamWriter creates a StreamWriter for writing data to the piece store server
|
|
type StreamWriter struct {
|
|
stream pb.PieceStoreRoutes_StoreClient
|
|
}
|
|
|
|
// Write Piece data to a piece store server upload stream
|
|
func (s *StreamWriter) Write(b []byte) (int, error) {
|
|
if err := s.stream.Send(&pb.PieceStore{Content: b}); err != nil {
|
|
return 0, fmt.Errorf("%v.Send() = %v", s.stream, err)
|
|
}
|
|
|
|
return len(b), nil
|
|
}
|
|
|
|
// Closes the piece store Write Stream
|
|
func (s *StreamWriter) Close() error {
|
|
reply, err := s.stream.CloseAndRecv()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Printf("Route summary: %v", reply)
|
|
|
|
return nil
|
|
}
|
|
|
|
// StreamReader is a struct for reading piece download stream from server
|
|
type StreamReader struct {
|
|
stream pb.PieceStoreRoutes_RetrieveClient
|
|
src *utils.ReaderSource
|
|
}
|
|
|
|
// NewStreamReader creates a StreamReader for reading data from the piece store server
|
|
func NewStreamReader(stream pb.PieceStoreRoutes_RetrieveClient) *StreamReader {
|
|
return &StreamReader{
|
|
stream: stream,
|
|
src: utils.NewReaderSource(func() ([]byte, error) {
|
|
msg, err := stream.Recv()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return msg.Content, nil
|
|
}),
|
|
}
|
|
}
|
|
|
|
// Read Piece data from piece store server download stream
|
|
func (s *StreamReader) Read(b []byte) (int, error) {
|
|
return s.src.Read(b)
|
|
}
|
|
|
|
// Close the piece store server Read Stream
|
|
func (s *StreamReader) Close() error {
|
|
return s.stream.CloseSend()
|
|
}
|