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 }