58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package blob
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
|
|
"forge.cadoles.com/arcad/edge/pkg/storage"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type NewBlobReaderArgs struct {
|
|
BlobID storage.BlobID
|
|
BucketID BucketID
|
|
}
|
|
|
|
type NewBlobReaderReply struct {
|
|
ReaderID ReaderID
|
|
}
|
|
|
|
func (s *Service) NewBlobReader(ctx context.Context, args *NewBlobReaderArgs, reply *NewBlobReaderReply) error {
|
|
bucket, err := s.getOpenedBucket(args.BucketID)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
readerID, err := NewReaderID()
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
reader, err := bucket.NewReader(ctx, args.BlobID)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
s.readers.Store(readerID, reader)
|
|
|
|
*reply = NewBlobReaderReply{
|
|
ReaderID: readerID,
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) getOpenedReader(id ReaderID) (io.ReadSeekCloser, error) {
|
|
raw, exists := s.readers.Load(id)
|
|
if !exists {
|
|
return nil, errors.Errorf("could not find writer '%s'", id)
|
|
}
|
|
|
|
reader, ok := raw.(io.ReadSeekCloser)
|
|
if !ok {
|
|
return nil, errors.Errorf("unexpected type '%T' for writer", raw)
|
|
}
|
|
|
|
return reader, nil
|
|
}
|