storj.io/uplink@v1.13.0/private/metaclient/stream.go (about) 1 // Copyright (C) 2019 Storj Labs, Inc. 2 // See LICENSE for copying information. 3 4 package metaclient 5 6 import ( 7 "time" 8 9 "storj.io/common/pb" 10 ) 11 12 // MutableStream is for manipulating stream information. 13 type MutableStream struct { 14 info Object 15 16 dynamic bool 17 dynamicMetadata SerializableMeta 18 dynamicExpires time.Time 19 } 20 21 // SerializableMeta is an interface for getting pb.SerializableMeta. 22 type SerializableMeta interface { 23 Metadata() ([]byte, error) 24 } 25 26 // BucketName returns streams bucket name. 27 func (stream *MutableStream) BucketName() string { return stream.info.Bucket.Name } 28 29 // Path returns streams path. 30 func (stream *MutableStream) Path() string { return stream.info.Path } 31 32 // Info returns object info about the stream. 33 func (stream *MutableStream) Info() Object { return stream.info } 34 35 // Expires returns stream expiration time. 36 func (stream *MutableStream) Expires() time.Time { 37 if stream.dynamic { 38 return stream.dynamicExpires 39 } 40 return stream.info.Expires 41 } 42 43 // Metadata returns metadata associated with the stream. 44 func (stream *MutableStream) Metadata() ([]byte, error) { 45 if stream.dynamic { 46 return stream.dynamicMetadata.Metadata() 47 } 48 49 if stream.info.ContentType != "" { 50 if stream.info.Metadata == nil { 51 stream.info.Metadata = make(map[string]string) 52 stream.info.Metadata[contentTypeKey] = stream.info.ContentType 53 } else if _, found := stream.info.Metadata[contentTypeKey]; !found { 54 stream.info.Metadata[contentTypeKey] = stream.info.ContentType 55 } 56 } 57 if stream.info.Metadata == nil { 58 return []byte{}, nil 59 } 60 return pb.Marshal(&pb.SerializableMeta{ 61 UserDefined: stream.info.Metadata, 62 }) 63 }