Eric Bower
·
2025-04-18
fs.go
1package storage
2
3import (
4 "fmt"
5 "io"
6 "log/slog"
7 "os"
8 "path/filepath"
9 "strings"
10
11 sst "github.com/picosh/pico/pkg/pobj/storage"
12 "github.com/picosh/pico/pkg/shared/mime"
13)
14
15type StorageFS struct {
16 *sst.StorageFS
17 Logger *slog.Logger
18}
19
20func NewStorageFS(logger *slog.Logger, dir string) (*StorageFS, error) {
21 st, err := sst.NewStorageFS(logger, dir)
22 if err != nil {
23 return nil, err
24 }
25 return &StorageFS{st, logger}, nil
26}
27
28func (s *StorageFS) ServeObject(bucket sst.Bucket, fpath string, opts *ImgProcessOpts) (io.ReadCloser, *sst.ObjectInfo, error) {
29 var rc io.ReadCloser
30 info := &sst.ObjectInfo{}
31 var err error
32 mimeType := mime.GetMimeType(fpath)
33 if !strings.HasPrefix(mimeType, "image/") || opts == nil || os.Getenv("IMGPROXY_URL") == "" {
34 rc, info, err = s.GetObject(bucket, fpath)
35 if info.Metadata == nil {
36 info.Metadata = map[string][]string{}
37 }
38 // StorageFS never returns a content-type.
39 info.Metadata.Set("content-type", mimeType)
40 } else {
41 filePath := filepath.Join(bucket.Name, fpath)
42 dataURL := fmt.Sprintf("s3://%s", filePath)
43 rc, info, err = HandleProxy(s.Logger, dataURL, opts)
44 }
45 if err != nil {
46 return nil, nil, err
47 }
48 return rc, info, err
49}