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 NewBlobWriterArgs struct {
|
|
BlobID storage.BlobID
|
|
BucketID BucketID
|
|
}
|
|
|
|
type NewBlobWriterReply struct {
|
|
WriterID WriterID
|
|
}
|
|
|
|
func (s *Service) NewBlobWriter(ctx context.Context, args *NewBlobWriterArgs, reply *NewBlobWriterReply) error {
|
|
bucket, err := s.getOpenedBucket(args.BucketID)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
writerID, err := NewWriterID()
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
writer, err := bucket.NewWriter(ctx, args.BlobID)
|
|
if err != nil {
|
|
return errors.WithStack(err)
|
|
}
|
|
|
|
s.writers.Store(writerID, writer)
|
|
|
|
*reply = NewBlobWriterReply{
|
|
WriterID: writerID,
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) getOpenedWriter(id WriterID) (io.WriteCloser, error) {
|
|
raw, exists := s.writers.Load(id)
|
|
if !exists {
|
|
return nil, errors.Errorf("could not find writer '%s'", id)
|
|
}
|
|
|
|
writer, ok := raw.(io.WriteCloser)
|
|
if !ok {
|
|
return nil, errors.Errorf("unexpected type '%T' for writer", raw)
|
|
}
|
|
|
|
return writer, nil
|
|
}
|